3

我一直在试验与 Findbugs 一起使用的 jsr 305 注释,特别是 @CheckForNull 注释,它可以避免我刚刚发现向客户发布的错误。我已将 jsr305.jar 和 annotations.jar 添加到我的构建路径中,但 findbugs 没有发现这些错误。我正在使用带有 Eclipse Findbugs 插件的 Eclipse。下面是一些示例代码,它显示了相同的错误,但是当我在它上面运行 findbugs 时没有找到错误。我已经在 Eclipse Galileo 和 Ganymede 中尝试过。

public class FindBugsAnnotationsTest {

    ArrayList<String> canBeNull;

    @CheckForNull
    public List<String> getCanBeNull() {
        return canBeNull;
    }

    public void shouldGetFindbugsWarning() {
    canBeNull.add("a string");

        getCanBeNull().add("a string");
    }
}
4

1 回答 1

2

这可能很明显,但我认为您的问题出在 Eclipse(尤其是 FindBugs 插件),而不是 FindBugs 本身。

您可能会考虑从命令行运行 FindBugs 以消除任何 Eclipse 问题并确保您自己的 FindBugs 正确运行。当您的 IDE 配置不正确时,知道如何在独立模式下运行 FindBugs 将为您提供回退。

我将您的源代码保存在一个名为 的文件中,添加了、和FindBugsAnnotationsTest.java的导入,编译并运行了 FindBugs 1.3.9。FindBugs 会生成几个关于空值的警告:ListArrayListCheckForNull

MD NP:FindBugsAnnotationsTest.shouldGetFindbugsWarning() 中可能的空指针取消引用,因为在 FindBugsAnnotationsTest.java 处取消引用的调用方法的返回值:[第 18 行]
MC UwF:未写字段:FindBugsAnnotationsTest.canBeNull 在 FindBugsAnnotationsTest.java:[第 12 行]
MC NP:在 FindBugsAnnotationsTest.java 中读取 FindBugsAnnotationsTest.shouldGetFindbugsWarning() 中未写入的字段 canBeNull:[第 16 行]
产生的警告:3

这些是我添加到顶部的导入FindBugsAnnotationsTest.java

import java.util.ArrayList;
import java.util.List;
import edu.umd.cs.findbugs.annotations.CheckForNull;

命令:

javac -d . -classpath ${FINDBUGS_HOME}/lib/findbugs.jar FindBugsAnnotationsTest.java
${FINDBUGS_HOME}/bin/findbugs FindBugsAnnotationsTest.class

${FINDBUGS_HOME}Findbugs 1.3.9 的安装目录在哪里。javac假定在路径上。

注意:我使用了findbugs.jar而不是,annotations.jarjsr305.jar使用此命令得到了相同的结果:

javac -d . -classpath ${FINDBUGS_HOME}/lib/annotations.jar:${FINDBUGS_HOME}/lib/jsr305.jar FindBugsAnnotationsTest.java
于 2009-09-11T20:30:43.683 回答