当前位置: 首页 > 知识库问答 >
问题:

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

孔华池
2023-03-14

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

NP:保证取消引用空值(NP\u guaranted\u DEREF)

有一条语句或分支,如果执行该语句或分支,将保证此时某个值为null,并保证该值被取消引用(在涉及运行时异常的转发路径上除外)。

请注意,如果(x==null)这样的检查抛出新的NullPointerException();被视为x的解引用。

除了在涉及运行时异常的前进路径上是什么意思?

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

共有1个答案

丁恩
2023-03-14

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

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

静态分析可以证明,当调用equals时,value将为null,从而引发NullPointerException。但是,如果调用doSomething()导致引发运行时异常,则永远无法调用equals。这就是“在涉及运行时异常的转发路径上除外”的含义

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

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

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

 类似资料:
  • 我们从2.4.0切换到2.7.0。这可能是什么原因造成的?我不能排除我们的代码有问题,但我们不在堆栈中。 ...忽略了14个常见帧,原因是:org.apache.ignite.ignite.internal.util.igniteutils.cast(igniteutils.java:7244)(org.apache.ignite.internal.processors.cache.store.G

  • 我对IntelliJ IDEA是个新手,使用如下所示一行: 有趣的是,它给出了“重复的代码片段(19行长)”错误。我在web上看了一下,有一些建议抑制这个警告,但是我想了解这个警告的主要原因,并在不改变设置的情况下通过代码端修复它。 如果您给出抑制此警告的建议也是可以的。

  • 问题内容: 我正在从我的一个类中执行Java二进制文件,并且抛出ClassNotFoundException: Geoline类位于/home/geo/Geoline.java。关键是,无论我位于文件系统中的哪个位置,如果我手动执行相同的命令,都将执行该类。使用Runtime.getRuntime()。exec执行二进制文件时,为什么不会发生相同的事情? 编辑:这是在verbose标记上生成的输出

  • 问题内容: 这是我的XML文件: 我做了两个类来解析它(Fields.java和Field.java): 和 但是我得到这个例外。 我不明白为什么会出现这种异常。异常在这里: 我使用的是JDK 1.6_0.0.7。谢谢。 问题答案: 例外是由于您的JAXB(JSR-222)实现认为存在两个名称相同的事物(一个字段和一个属性)。您的用例有两个选项: 选项#1-使用以下注释字段 如果要注释该字段,则应

  • 我试图在Java中将扫描字符串转换为JSONObject,并从JSON Simple导入JSON模块。我已经在构建路径中添加了JSON-simple-1.1.1.jar。然而,当我试图传递内联字符串时。我的内联字符串如下:{“events”:[{“url”:“/操纵多云国家”,“visitorId”:“03c0b5e0-3eeb-382a-8c6d-35e4bb189cf6”,“timestamp

  • 我有以下代码段: 然而,findbugs说有一种不好的做法: It:Iterator next()方法不能抛出NoSuchElementException(It\u NO\u SUCH\u元素),该类实现java。util。迭代器接口。然而,它的next()方法不能抛出java。util。无接触元素异常。应该更改next()方法,以便在没有更多元素可返回时调用它时抛出NoTouchElementE