我注意到 Oracle JDK 中的许多 Java 8 方法使用 Objects.requireNonNull()
,如果给定的对象(参数)是 ,它会在内部抛出
。NullPointerException
空
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
但是如果 null
对象被取消引用,则无论如何都会抛出 NullPointerException
。那么,为什么要进行这种额外的空检查并抛出
NullPointerException
?
一个明显的答案(或好处)是它使代码更具可读性,我同意。我很想知道使用的任何其他原因
Objects.requireNonNull()
在方法的开头。
最佳答案
因为您可以通过这样做使事情显式。喜欢:
public class Foo {
private final Bar bar;
public Foo(Bar bar) {
Objects.requireNonNull(bar, "bar must not be null");
this.bar = bar;
}
或更短:
this.bar = Objects.requireNonNull(bar, "bar must not be null");
现在你知道了:
- 当使用
new()
成功创建了一个 Foo 对象 - 那么它的bar字段保证不为空。
比较一下:你今天创建了一个 Foo 对象,明天你调用了一个使用该字段并抛出的方法。很可能,您明天将不知道为什么该引用在 昨天被传递给构造函数时为空!
换句话说:通过显式使用此方法检查传入引用,您可以控制抛出异常的时间点。大多数时候,您希望尽快失败!
主要优点是:
- 如前所述,受控行为
- 更容易调试 - 因为你在对象创建的上下文中抛出。在某个时间点,您的日志/跟踪有一定机会告诉您出了什么问题!
- 如上所示:这个想法的真正力量与 final 字段一起展现。因为现在您的类中的任何其他代码 都可以安全地假定
bar
不为空 - 因此您不需要任何if (bar == null)
在其他地方检查!
关于java - 为什么要使用 Objects.requireNonNull()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45632920/