1

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

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

因此,当我使用 java 5 个参数时,我必须创建 5 个 ifs 来检查空输入对象。不这样做我想使用javax.annotation.Nonnulljavax.annotation.CheckForNull做类似的事情。

public Pageable<MyObject>findAccount(@Nonnull String accountExternalId){
         ...
  }

并使用 findbugs

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

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

4

2 回答 2

2

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

第二个。

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

如果@Nonnull那么它基本上表示调用者有责任确保将非空参数传递给方法或方法不返回空值。

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

于 2015-06-28T12:26:19.017 回答
0

你有两个选择:

  • 允许客户端代码传递空值,但如果这样做则抛出运行时错误。
  • 通过从不运行可能这样做的代码来防止客户端代码传递空值。

您的示例代码使用运行时检查方法。您还可以从annotations生成运行时检查@Nonnull

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

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

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

您可能需要考虑使用替代工具进行静态检查。一个例子是检查器框架。与 FindBugs 不同的是,它提供了正确性保证,并且使用了更精确的分析。缺点是你必须用@Nullable注解来注解你的代码,但你似乎已经愿意这样做了。

于 2015-06-29T09:13:13.187 回答