两者有什么区别?两者似乎都意味着该值可能为空,因此应相应处理,即检查为空。
更新 上面的两个注释是JSR-305 / FindBugs的一部分: http://findbugs.sourceforge.net/manual/annotations.html
答案 0 :(得分:30)
我认为从您添加的链接中可以清楚地看出:如果您使用@CheckForNull
并且使用该值的代码未检查null
,则FindBugs会将其显示为错误。
FindBugs会忽略@Nullable
。
实际上,此注释仅用于覆盖总体
NonNull
注释。
在必须始终检查值的情况下使用@CheckForNull
。使用@Nullable
,其中null
可能没问题。
编辑:目前似乎@CheckForNull
不受支持,所以我建议避免使用@NonNull
(另请参阅Which @NotNull Java annotation should I use?)。
另一个想法是直接与FindBugs开发人员取得联系,并询问他们对文档中不一致的看法。
答案 1 :(得分:9)
@Nonnull
和@Nullable
。 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 {
public @Nullable String nullable() {
return "";
}
public @Nonnull String nonnull() {
return null; // IDEA, findbugs
}
public @CheckForNull 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());
}
}
答案 2 :(得分:3)
在IntelliJ中,默认情况下支持@javax.annotation.Nullable
,任何取消引用@Nullable
参数或返回值的尝试都会导致警告。
@ alexander-pavlov,您可以在“常数条件和例外”检查的配置中添加@javax.annotation.CheckForNull
。 Go File-> Settings-> Inspections-> Probable bugs-> Constant conditions&例外 - >配置注释。
我更喜欢这样做,因为@CheckForNull
比上面的答案中提到的@lbalazscs的@Nullable
具有更明确的含义。