为什么FindBugs在明确抛出NPE时会发出严重警告?

时间:2013-03-21 07:32:35

标签: java null nullpointerexception static-analysis findbugs

FindBugs error desriptions

考虑以下内容
  

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

     

有一个声明或分支,如果执行保证a   此时value为null,并且该值保证为   dereferenced(涉及运行时异常的前向路径除外)。

     

请注意,if(x == null)之类的检查会抛出新的   空指针异常();被视为x的解除引用。

是什么意思,除了涉及运行时异常的转发路径

同样为什么像if (x == null) throw new NullPointerException();之类的支票会发出警告?

1 个答案:

答案 0 :(得分:3)

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

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

静态分析可以证明value在调用null时将equals,导致NullPointerException被抛出。但是,如果对doSomething()的调用导致抛出运行时异常,则永远不会调用equals。这是“除了涉及运行时异常的前向路径之外”的含义。

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

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

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