1

我不确定它是否应该,但 FindBug 没有检测到以下错误:

public @Nullable String getNull() {
    return null;
}
public @Nonnull String getNotNull() {
    return getNull();
}
public void doSomething() {
    getNull().length();
}

它只检测:

public @Nonnull String getNotNull() {
    return null;
}

但是这种情况不如检查@Nonnull返回方法合同有用...

我用:

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

和摇篮:

apply plugin: 'findbugs'
4

1 回答 1

2

Checker Reference Manual 的第 3.7.2 节解释了这种(不受欢迎的)行为:

3.7.2 关于 FindBugs @Nullable 的不兼容说明

FindBugs 对@Nullable 有非标准定义。FindBugs 的处理方法没有记录在它自己的 Javadoc 中;它与其他所有用于空值分析的工具中的 @Nullable 定义不同;当应用于形式参数时,它的含义与 @NonNull 相同;它总是让程序员感到惊讶。因此,FindBugs 的 @Nullable 是有害的,而不是作为文档有用。在实践中,最好不要依赖 FindBugs 进行空值分析,即使您发现 FindBugs 可用于其他目的......

FindBugs 禁止使用 @Nullable 变量时的所有警告。(您必须使用 @CheckForNull 来指示 FindBugs 应该检查的可为空变量。)...

// declare getObject() to possibly return null
@Nullable Object getObject() { ... }

void myMethod() {
   @Nullable Object o = getObject();
   // FindBugs issues no warning about calling toString on a possibly-null reference!
   o.toString();
}

...使用 FindBugs,您可以对声明进行注释,该声明会禁止在所有客户端使用处进行检查,甚至是您要检查的地方。

于 2018-08-08T06:35:03.117 回答