代码之家  ›  专栏  ›  技术社区  ›  alex2k8

使用FindBugs发现NullPointerException错误

  •  9
  • alex2k8  · 技术社区  · 14 年前

    当我对这段代码运行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 回复  |  直到 9 年前
        1
  •  1
  •   Eyal Schneider    14 年前

    我同意亚历克斯2K8。这可能是因为_closeddata成员。只要它没有被声明为final,它的初始化就无关紧要。静态分析没有通用的方法来确定运行时关闭的实际值,也没有软件可以这样做(它相当于 Halting problem

        2
  •  1
  •   alex2k8    14 年前

    NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE
    

    找到两个文件:

    1. 股份有限公司OnInstantAnnotations.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());
    }
    
        3
  •  0
  •   Michael Donohue Reno    14 年前

    您希望使用@CheckForNull而不是@Nullable

        4
  •  0
  •   Jarle Hansen    14 年前

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

    编辑

    总是 以要求它为非null的方式使用,但参数被显式地注释为可为null。参数或注释的使用错误。

    我的猜测是,由于它不是最终参数,FindBugs不能/不会对

        5
  •  0
  •   Community CDub    4 年前

    教育学硕士.findbugs.annotations.Nullable

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

    在实践中,这个注释只在重写非空注释时有用。

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

        6
  •  -1
  •   DrewM    14 年前

    运行JavaLint-我想它会告诉你的

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