FindBug无法从javax.annotation.Nullable方法检测到null

时间:2018-07-25 19:41:08

标签: java findbugs spotbugs

我不确定是否应该这样做,但是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;

和Gradle:

apply plugin: 'findbugs'

1 个答案:

答案 0 :(得分:1)

Section 3.7.2 of the Checker Reference Manual解释了这种(不良的)行为:

  

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注释一个声明,该声明禁止检查   所有客户使用的地方,甚至包括您要检查的地方。