【问题标题】:Why does FindBugs raise a critical warning when explicitly throwing a NPE?为什么 FindBugs 在显式抛出 NPE 时会发出严重警告?
【发布时间】:2013-03-10 14:59:22
【问题描述】:

考虑FindBugs error desriptions的以下内容

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

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

请注意,例如 if (x == null) throw new 这样的检查 空指针异常();被视为 x 的取消引用。

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

还有为什么像if (x == null) throw new NullPointerException(); 这样的检查会引发警告?

【问题讨论】:

  • 改为抛出 InvalidArgumentException
  • 可能:除非在执行路径之前抛出另一个运行时异常?
  • 不是说x在比较的时候保证是null,所以比较是多余的?

标签: java null nullpointerexception static-analysis findbugs


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • “因为它与JVM所做的相同”我们在编译时是否看到此警告?
  • @Greek - 不,我的意思是 JVM 会抛出一个 NullPointerException。我澄清了最后一段。
  • 如何将检查引用是否为空称为解除引用?我没有做类似value.someAttribute
  • @Greek - 发布您的实际代码。我无法在没有看到它的情况下推理它。我是说 FindBugs 看到 null 的测试带有抛出的 NPE 并将其视为取消引用。这是一个已经编码的规则;我只是解释它的含义。
  • 代码和你的第二个sn-p一样。我明白你在说什么。我会接受你的回答并 +1 进行跟进。
猜你喜欢
  • 2014-09-25
  • 1970-01-01
  • 2011-10-10
  • 2011-08-26
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多