NPE注释场景和Java静态分析工具
以下是一些可以抛出NullPointerException的代码片段。
01:
public void m1(@Nullable String text) { System.out.print(text.toLowerCase()); // <-- expect to be reported. }
02:
private boolean _closed = false; public void m1(@Nullable String text) { if(_closed) return; System.out.print(text.toLowerCase()); // <-- expect to be reported. }
03:
public void m1(@NotNull String text) { System.out.print(text.toLowerCase()); } public @Nullable String getText() { return "Some text"; } public void m2() { m1(getText()); // <-- expect to be reported. }
不同的人可以访问不同的静态分析工具。 收集信息,能够检测和报告问题的工具以及失败的内容会很好。 另外,如果你有自己的风景,请发布它们。
在这里我的结果
FindBugs(1.3.9):
- 01:[S]参数必须是非空的,但标记为可为空
- 02:[F]未报告
- 03:[F]没有报道
IntelliJ IDE 9.0.2(社区版):
- 01:[S]方法调用text.toLowerCase()可能会产生java.lang.NullPointerException
- 02:[S]方法调用text.toLowerCase()可能会产生java.lang.NullPointerException
- 03:[S] Argument getText()可能为null
Checker Framework(1.0.7):
- 01:[S]取消引用可能为空的参考文本
- 02:[S]取消引用可能为空的参考文本
- 03:[S]不兼容的类型。 found:@Nullable String,required:@NonNull String
注释包:
javax.annotation.* // JSR 305 edu.umd.cs.findbugs.annotations.* // FindBugs org.jetbrains.annotations.* // IntelliJ checkers.nullness.quals.* // Checker Framework
请注意,FindBugs对待@Nullable和@CheckForNull的方式完全不同 – 前者基本上是在说“我不知道这是否应该允许null”,而后者则说“此方法明确允许空值”。 当我们在代码中全局地将所有@Nullable更改为@CheckForNull时,我的团队有更多有用的FindBugs结果,因为后者是我们真正的意思。