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

新手上路,请多包涵

我注意到 Oracle JDK 中的许多 Java 8 方法使用 Objects.requireNonNull() ,如果给定对象(参数)是 null ,则内部抛出 NullPointerException

 public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

但是,如果取消引用 NullPointerException null 对象,无论如何都会抛出 --- 。那么,为什么要进行这种额外的空值检查并抛出 NullPointerException

一个明显的答案(或好处)是它使代码更具可读性,我同意。我很想知道在方法开始时使用 Objects.requireNonNull() 的任何其他原因。

原文由 user4686046 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

因为您可以通过这样做使事情变得 明确。喜欢:

 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()
  • 那么 它的 bar 字段 保证 是非空的。

将其与:您今天创建一个 Foo 对象, 明天 您调用一个使用该字段并抛出的方法。最有可能的是,您明天将不知道为什么 昨天 将引用传递给构造函数时为空!

换句话说:通过显式使用此方法检查 传入 引用,您可以 控制 引发异常的时间点。大多数时候,你想尽快 _失败_!

主要优点是:

  • 如前所述, 受控 行为
  • 更容易调试 - 因为您在对象创建的上下文中抛出。在某个时间点,您的日志/跟踪有一定的机会告诉您出了什么问题!
  • 如上所示:这个想法的真正力量与 final 字段一起展现。因为现在您班级中的 任何其他代码 都可以安全地假设 bar 不为空 - 因此您不需要任何 if (bar == null) 检查其他地方!

原文由 GhostCat 发布,翻译遵循 CC BY-SA 3.0 许可协议

快速失败

代码应该尽快崩溃。它 应该做一半的工作,取消引用 null 然后才崩溃,留下一半的工作完成导致系统处于无效状态。

这通常称为“早期失败”或“快速失败”。

原文由 luk2302 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题