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结果,因为后者是我们真正的意思。