javax.annotation:@Nullable vs @CheckForNull

vit*_*aly 43 java annotations static-analysis findbugs

两者有什么区别?两者似乎都意味着该值可以为null并且应该相应地处理,即检查为null.

更新: 上面的两个注释是JSR-305/FindBugs的一部分:http: //findbugs.sourceforge.net/manual/annotations.html

lba*_*scs 31

我认为从您添加的链接中可以清楚地看到:如果您使用@CheckForNull并且使用该值的代码未检查null,则FindBugs会将其显示为错误.

FindBugs会忽略@Nullable.

实际上,此注释仅用于覆盖总体NonNull注释.

@CheckForNull在必须始终检查值的情况下使用.利用@Nullable其中null可能确定.

编辑:目前似乎@CheckForNull没有得到很好的支持,所以我建议避免使用它@NonNull(也可以看看我应该使用哪种@NotNull Java注释?).另一个想法是直接与FindBugs开发人员取得联系,并询问他们对文档中不一致的看法.


Ale*_*lov 10

@Nonnull@Nullable通过IntelliJ IDEA的正确处理.FindBugs发现了问题,@Nonnull但错过了那些@Nullable@CheckForNUll.IDEA和FindBugs检测到的问题都标有注释.

package com.db.icestation;

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

public class test {

    @Nullable public String nullable() {
        return "";
    }

    @Nonnull public String nonnull() {
        return null; // IDEA, findbugs
    }

    @CheckForNull public String checkForNull() {
        return null;
    }

    public static void main(String[] args) {
        System.out.println(new test().nullable().length()); // IDEA
        System.out.println(new test().nonnull().length());
        System.out.println(new test().checkForNull().length());
    }
}
Run Code Online (Sandbox Code Playgroud)


Ily*_*rov 5

在 IntelliJ Idea 中,@javax.annotation.Nullable默认情况下受支持,任何取消引用@Nullable参数或返回值的尝试都将导致警告。

@alexander-pavlov,您可以添加@javax.annotation.CheckForNull“恒定条件和例外”检查的配置。转到文件->设置->检查->可能的错误->恒定条件和异常->配置注释。

我更喜欢这样做,因为它比 @lbalazscs 在上面的回答中提到的@CheckForNull意义更明确。@Nullable