使用FindBugs发现NullPointerException错误

时间:2010-05-07 21:28:33

标签: 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.println(text.toLowerCase());  // FindBugs: text must be nonnull but is marked as nullable
}

为什么在第一种情况下会失败?

6 个答案:

答案 0 :(得分:1)

我同意alex2k8。这可能是因为_closed数据成员。只要它没有被声明为final,它的初始化就无关紧要了。静态分析没有通用的方法来确定运行时_closed的实际值,也没有软件可以做到(它等同于Halting problem)。

答案 1 :(得分:1)

我使用了FindBugs源代码并搜索了

NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE

找到两个文件:

  1. BuildUnconditionalParamDerefDatabase.java
  2. InconsistentAnnotations.java
  3. 两者都只考虑“无条件参数解除引用”。

    看起来FindBugs对查找空指针问题并不是那么有用: - (

    P.S。

    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());
    }
    

答案 2 :(得分:0)

  

@Nullable仅适用于您希望允许为null的参数,方法或字段。

好像你正在为文本变量允许空值。您可能应该使用@NonNull。

修改

我为自己尝试了这个并得到了同样的结果。

findbugs错误中的文本(来自确实给出nullpointer错误的第二种方法)报告说:

  

此参数始终以要求它为非空的方式使用,但该参数明确注释为Nullable。使用参数或注释是错误的。

我的猜测是,因为它不是最终参数FindBugs不能/不会做出任何关于 _closed的值,因为您可以在以后更改它。我甚至尝试在m1方法中使用_closed variabel方法作为范围,它仍然不会将其报告为错误。

答案 3 :(得分:0)

您想使用@CheckForNull而不是@Nullable

答案 4 :(得分:0)

  

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

     

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

     

在实践中,此注释仅用于覆盖总体NonNull注释。

http://findbugs.sourceforge.net/manual/annotations.html

答案 5 :(得分:-1)

运行JavaLint - 我怀疑它会告诉你

System.out.println(text.toLowerCase());
第一个例子中的

是无法访问的。由于它无法访问,我猜测FindBug并不关心它是否会导致NullPointerException