2

从FindBugs 错误描述中考虑以下内容

NP:保证取消引用空值(NP_GUARANTEED_DEREF)

有一个语句或分支,如果执行,则保证此时的值为 null,并且保证取消引用该值(涉及运行时异常的正向路径除外)。

请注意,诸如 if (x == null) 之类的检查 throw new NullPointerException(); 被视为 x 的取消引用。

涉及运行时异常的正向路径上的 except 是什么意思?

还有为什么要if (x == null) throw new NullPointerException();发出警告之类的支票?

4

1 回答 1

3

考虑一下这个可怕的人为代码:

String value = null;
if (5 > 8) {
    value = "foo";
}
doSomething();
if (value.equals("foo")) {
    System.out.println("value is foo");
}

静态分析可以证明valuewill be nullwhenequals被调用,导致 aNullPointerException被抛出。但是,如果调用doSomething()导致抛出运行时异常,则调用equals将永远无法到达。这就是“在涉及运行时异常的正向路径上除外”的含义。

至于您的第二个问题,FindBugs 对此代码发出警告

if (value == null) {
    throw new NullPointerException();
}

null因为效果与取消引用值时发生的效果相同。由于取消引用值得警告,因此任何模仿该取消引用的代码也是如此。

于 2013-03-22T17:24:17.617 回答