@Nonnull和Objects.requireNonNull有什么区别

时间:2018-01-04 21:24:07

标签: java

以下两个代码段之间有什么区别。

OOP

它们之间有什么重大差异。在这些情况下进行空检查的正确方法是什么。

3 个答案:

答案 0 :(得分:16)

这两者是互补的:@Nonnull注释记录了obj必须为非空的事实,而Objects.requireNonNull调用确保obj在运行时非空时间。

你应该将两者结合起来,如下所示:

public Integer getId(@Nonnull SomeObject obj){   
    Objects.requireNonNull(SomeObject, "SomeObject is null");
    // do some stuff
    return id;
}

可以找到@Nonnull上的相关文档here

  

可选类型注释不能代替运行时验证

     

在Type Annotations之前,用于描述诸如nullability或range之类的内容的主要位置在javadoc中。使用Type注释,此通信以编译时验证的方式进入字节码。

     

您的代码仍应执行运行时验证。

答案 1 :(得分:6)

不同之处在于,在第一种情况下,它为编译器和IDE提示参数不应为null,因此当您编写getId(null)时,您将收到错误消息。但有人可能会在运行时传递null值。

至于第二种情况,它是一种防御性编程,当你失败时,前提是参数不应该是null

答案 2 :(得分:3)

其中一个是实现JSR-305的注释,但对于静态分析而言则更多,而不是运行时保护。我记得它,原则上JSR-305是一个好主意,很多东西实际上都以某种方式利用它,但是当它的效用只是以静态分析的形式出现时,它失去了很多吠声。

例证:您的IDE可以利用它来警告您传递不应该传递的内容的情况,但它不能阻止您在编译时将null传递给此方法。

Objects.requireNonNull运行时强制执行,无论它传递的是什么,都是非空引用。编译器也不能强制执行此操作,但在运行时,如果您收到空值,则在执行该行代码时将获得NullPointerException

就正确性而言,使用Objects.requireNonNull是一个好主意,但这取决于您在运行应用程序时的义务。如果 必须 在空值上失败,那么使用它就可以了,因为它会生成一个运行时异常来处理。如果 无法 在空值上失败,那么使用if检查会更好。