java - 为什么要使用 Objects.requireNonNull()?

标签 java java-8 nullpointerexception

我注意到 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/

相关文章:

java - 从半高亮文本中获取非高亮文本的更好算法

java - 泛型行为在 JDK 8 和 9 中有所不同

java - 我自己的图形类中使用 HashMap 的 NPE

java - 什么是NullPointerException,我该如何解决?

Java - While Loop不断重复披萨程序

java - 为什么 JPA Transient 注解在 Target 中有方法?

java继承删除子对象

java - Java 8 Streams 中的并行性和平面图

java - 如何在 Java 8 流中将两个字符串列表合并到一个列表中而不重复

java - 尝试从另一个面板获取文本时出现 NullPointerException