Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用FindBugs发现NullPointerException错误_Java_Static Analysis_Findbugs - Fatal编程技术网

Java 使用FindBugs发现NullPointerException错误

Java 使用FindBugs发现NullPointerException错误,java,static-analysis,findbugs,Java,Static Analysis,Findbugs,当我在这段代码上运行FindBugs时,它不会报告任何问题 boolean _closed = false; public void m1(@Nullable String text) { if(_closed) return; System.out.println(text.toLowerCase()); } 在这里,它发现了预期的问题: public void m1(@Nullable String text) { System.out.prin

当我在这段代码上运行FindBugs时,它不会报告任何问题

boolean _closed = false;

public void m1(@Nullable String text) {
    if(_closed)
        return;

    System.out.println(text.toLowerCase());
}
在这里,它发现了预期的问题:

public void m1(@Nullable String text) {
    System.out.println(text.toLowerCase());  // FindBugs: text must be nonnull but is marked as nullable
}
为什么它在第一种情况下失败

@只能在您希望允许为null的参数、方法或字段上为null

似乎您允许文本变量为空值。您可能应该改用@NonNull

编辑

我自己尝试了一下,得到了同样的结果

findbugs错误报告中的文本(来自第二个产生nullpointer错误的方法)说:

此参数总是以要求其为非Null的方式使用,但该参数被显式注释为可为Null。参数或注释的使用是错误的

我的猜测是,由于它不是最终参数,FindBugs不能/不会对
关闭_的值,因为您可以稍后更改它。我甚至尝试将_closedvariabel方法限定在m1方法的范围内,但它仍然没有将其报告为bug。

运行JavaLint-我怀疑它会告诉您这一点

System.out.println(text.toLowerCase());

在第一个例子中,是无法到达的。由于它是不可访问的,我猜FindBug并不关心它是否会导致NullPointerException

您想使用@CheckForNull而不是@Nullable

我同意alex2k8。这可能是因为_closeddata成员。它的初始化是不相关的,只要它没有声明为final。静态分析没有通用的方法来确定运行时关闭的_的实际值,也没有任何软件能够做到这一点(它相当于)

NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE
找到两个文件:

  • buildUnconditionalParametereFDatabase.java
  • unconsistentations.java
  • 仅考虑“无条件PARAMS”,

    看起来FindBugs在查找空指针问题方面没有那么大用处:-(

    附言

    edu.umd.cs.findbugs.annotations.Nullable [目标]字段、方法、参数

    在某些情况下,带注释的元素可能为空。一般来说,这意味着开发人员必须阅读文档,以确定何时可以接受空值,以及是否有必要检查空值。FindBugs会将带注释的项视为没有注释

    在实践中,此注释仅在覆盖覆盖总体非空注释时有用


    你可能是指FindBugs,java静态分析工具,而不是Firebug,firefox扩展,对吧?+1个好问题!到目前为止还没有很好的答案。也许这是FindBugs中的一个bug!?我希望FindBugs也会抱怨第二个bug,但我们会看到……顺便说一句,我尝试了IntelliJ IDEA-它的代码检查在这个ex上工作得非常完美考虑到我希望能够调用M1()使用“null”值。因此我将“text”标记为@Nullable。m1本身应该处理“null”值,但它不会。因此我希望FindBug报告一个问题,它会报告,但只在非常简单的情况下报告。被答案弄糊涂了……当您使用if(\u closed)运行我的代码时,您想说FindBugs正在报告一个错误吗条件?很抱歉,我确实得到了与您相同的结果。现在我试图让答案更清楚请注意,_closed是'false'。而且,_closed不是final,所以它可能会被其他方法更改…因为代码是可访问的。实际上我相信静态分析器应该检查所有分支,并在任何分支有问题时发出警告。@alex2k8 the这种方法的一个大问题是,你会得到太多的误报,以至于这个工具对你来说毫无用处(当然,除非你是管理误报的粉丝)@ Alx2K8如果你想查看像ESC/java这样的工具,FindBugs的目标是有少量的假阳性,而不是彻底地考虑所有可能的情况。在实际情况中,他们在某些情况下考虑和报告这个注释的问题。
    public void m1(@CheckForNull String text) {
        if(_closed) // FindBugs: text must be nonnull but is marked as nullable
            System.out.println(text.toUpperCase());
        else
            System.out.println(text.toLowerCase());
    }