以下两个代码段之间有什么区别。
OOP
它们之间有什么重大差异。在这些情况下进行空检查的正确方法是什么。
答案 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
检查会更好。