Java的NPE注释场景和静态分析工具

7
这里有一些可能会抛出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] 参数必须为nonnull但标记为nullable
  • 02: [F] 未报告
  • 03: [F] 未报告

IntelliJ IDE 9.0.2(Community edition):

  • 01:[S] 方法调用text.toLowerCase()可能会产生java.lang.NullPointerException
  • 02:[S] 方法调用text.toLowerCase()可能会产生java.lang.NullPointerException
  • 03:[S] 参数getText()可能为空

Checker Framework (1.0.7):

  • 01:[S] 可能为空引用文本的取消引用
  • 02:[S] 可能为空引用文本的取消引用
  • 03:[S] 不兼容类型。已找到:@Nullable String,所需:@NonNull String

注释包:

javax.annotation.* // JSR 305
edu.umd.cs.findbugs.annotations.* // FindBugs
org.jetbrains.annotations.* // IntelliJ
checkers.nullness.quals.* // Checker Framework

由于您要求多人贡献答案,您可能希望将此社区设为维基。 - bmargulies
请指明 @Nullable 和 @NotNull 来自哪个包,因为它们不是 Java 6 的一部分。 - Michael Konietzka
  1. 标记为社区维基。
  2. 不同的工具似乎有自己的注释库。对于IntelliJ,它们来自org.jetbrains.annotations.,而对于FindBugs,则是edu.umd.cs.findbugs.annotations. 但在这两种情况下,该库都被称为annotations.jar。
- alex2k8
很好的问题。看看工具提供的与NPE相关的其他功能也会很有趣,例如来自Checker Framework的lazy-nonnull。 - DaveFar
IntelliJ还允许您配置检查(常量条件和异常),以便为@Nullable@NonNull注释使用您想要的任何注释。例如,您可以使用FindBugs注释。这样,您可以在IDE中看到与FindBugs捕获的相同错误。 - undefined
1个回答

2
请注意,FindBugs对@Nullable和@CheckForNull的处理方式有很大不同--前者基本上表示“我不知道这是否允许为空”,而后者则表示“此方法明确允许为空”。当我们在代码中全局将所有@Nullable更改为@CheckForNull时,我的团队得到了更有用的FindBugs结果,因为后者才是我们真正想要的。请注意保留HTML标签。

是的,说得好...虽然我在使用CheckForNull或Nullable进行FindBug时提供的测试结果相同。 - alex2k8
@alex2k8:有趣。我想知道更近期的FindBugs版本是否改变了这一点? - Chris Dolan
FindBugs 的当前版本是 1.3.9(我在测试中使用的版本)。 - alex2k8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接