Java 理解@Nonnull和@CheckForNull说明

Java 理解@Nonnull和@CheckForNull说明,java,spring,null,non-nullable,Java,Spring,Null,Non Nullable,在我的Spring项目中有一个服务 public Pageable<MyObject>findAccount(String accountExternalId){ if (accountExternalId== null) { throw new ProjectException("Missing account"); } ... } 并使用findbugs <groupId> com.google.co

在我的Spring项目中有一个服务

  public Pageable<MyObject>findAccount(String accountExternalId){
  if (accountExternalId== null) {
            throw new ProjectException("Missing account");
     }
  ...
}
并使用findbugs

  <groupId>
        com.google.code.findbugs
  </groupId>
  <artifactId>
        findbugs
  </artifactId>

com.google.code.findbugs
芬德布格斯
所以我想知道这个注释如何防止用户不传递Null值?或者它只注释您不必传递null,并且仅用于信息目的

所以我想知道这个注释是如何防止用户不传递空值的?或者它只注释您不必传递null,并且仅用于信息目的

第二个

然而,FindBugs也使用一些注释进行分析;例如,如果您有一个
@Nullable
参数(或方法返回值),并且FindBugs在代码中检测到您在使用该参数(或方法返回值)之前没有检查该参数是否为null,则会引发问题

如果
@Nonnull
,则它基本上表示调用者有责任确保将非null参数传递给该方法,或者该方法不返回null

(不确定
@CheckForNull
@Nullable
之间的区别)

您有两个选择:

  • 允许客户端代码传递空值,但如果传递空值,则抛出运行时错误
  • 通过从不运行可能传递空值的代码,防止客户端代码传递空值
示例代码使用运行时检查方法。你也可以

编译时检查方法(也称为“静态分析”)更可取,是FindBugs方法。图书馆作者使用
@Nonnull
注释编写图书馆合同;静态分析在构建任何库代码时运行;如果静态分析表明客户端代码可能违反库的合同,则不应运行客户端代码

如果在构建客户机代码时始终运行静态分析,则不需要在库中进行运行时检查。即使您选择在库中包含运行时检查,静态分析仍然很有用,因为它在编译时、测试或部署之前发现bug

如果您想要担保,您可能不想使用FindBugs。FindBugs是一个尽力而为的工具,可以发现一些错误,但它不会试图找到所有错误。此外,当应用于形式参数(!)时,FindBugs将
@NonNull
视为与
@Nullable
具有相同的含义


您可能需要考虑静态检查的替代工具。一个例子是。与FindBugs不同,它提供了正确性保证,并且使用更精确的分析。缺点是,您必须使用

@Nullable
注释对代码进行注释,但您似乎已经愿意这样做了。

确定的可能重复,因此即使我写入@Nonnull,我仍然必须进行if检查,并在通过null时抛出异常?@fge这里解释了区别:
  <groupId>
        com.google.code.findbugs
  </groupId>
  <artifactId>
        findbugs
  </artifactId>