我一直在尝试使用jsr 305注释与Findbugs一起使用,特别是@CheckForNull注释,它可以避免我刚刚发现给客户的错误。我已将jsr305.jar和annotations.jar添加到我的构建路径中,但findbugs找不到错误。我正在使用Eclipse和Eclipse Findbugs插件。下面是一些示例代码,它显示了相同的错误,但是当我运行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");
}
}
答案 0 :(得分:2)
这可能很明显,但我认为你的问题是Eclipse(特别是FindBugs插件),而不是FindBugs本身。
您可以考虑从命令行运行FindBugs以消除任何Eclipse问题,并确保您自己正确运行FindBugs。了解如何在独立模式下运行FindBugs将在未正确配置IDE时为您提供回退。
我将源代码保存在名为FindBugsAnnotationsTest.java
的文件中,添加了List
,ArrayList
和CheckForNull
的导入,编译并运行了FindBugs 1.3.9。 FindBugs会生成几个关于空值的警告:
M D NP: Possible null pointer dereference in FindBugsAnnotationsTest.shouldGetFindbugsWarning() due to return value of called method Dereferenced at FindBugsAnnotationsTest.java:[line 18] M C UwF: Unwritten field: FindBugsAnnotationsTest.canBeNull At FindBugsAnnotationsTest.java:[line 12] M C NP: Read of unwritten field canBeNull in FindBugsAnnotationsTest.shouldGetFindbugsWarning() At FindBugsAnnotationsTest.java:[line 16] Warnings generated: 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.jar
和jsr305.jar
,但我使用此命令获得了相同的结果:
javac -d . -classpath ${FINDBUGS_HOME}/lib/annotations.jar:${FINDBUGS_HOME}/lib/jsr305.jar FindBugsAnnotationsTest.java