Objects#requireNonNull的目的是什么?

时间:2014-12-16 18:07:14

标签: java

在检查了JavaDocs我正在考虑使用的方法requiredNonNull后,我偶然发现了第一个使用单个参数(T obj)的方法。

然而,使用此签名的此特定方法的实际目的是什么?所有这一切只是投掷和NPE,我有点积极(因为我可能会遗漏一些明显的东西)无论如何都会抛出。

  

抛出:        NullPointerException - 如果obj为null


后者在调试某些代码方面实际上是有意义的,正如文档所述,它主要是为参数验证而设计的

public static <T> T requireNonNull(T obj,String message)

  

检查指定的对象引用是否为null,如果是,则抛出自定义的NullPointerException。

因此,我可以与NPE一起打印特定信息,使调试变得更加容易。


考虑到这一点,我非常怀疑我会遇到一种情况,我宁愿只使用前者。请赐教。

tl; dr - 你为什么要使用没有收到信息的重载。

2 个答案:

答案 0 :(得分:28)

编写软件时的一个好原则是尽早发现错误。您注意到的速度越快,例如传递给方法的null等错误值,就越容易找出原因并解决问题。

如果您将null传递给不应该接收null的方法,则NullPointerException可能会在某处发生,正如您已经注意到的那样。但是,除非一些方法进一步下降,否则可能不会发生异常,当它发生在内部深处时,找到错误的确切来源将更加困难。

因此,当方法预先检查他们的参数并在找到无效值(例如null)时抛出异常会更好。

编辑 - 关于单参数版本:即使您不提供错误消息,检查参数并提前抛出异常比让null通过更有用直到异常发生在更深处的某个地方。堆栈跟踪将指向您使用Objects.requireNonNull(...)的行,作为开发人员,您应该明白这意味着您不应该通过null。当你隐含地发现NullPointerException时,你不知道原始程序员是否有意图变量不应该是null

答案 1 :(得分:1)

这是一种实用方法。只是捷径! (快捷方式设计师有自己的快捷方式样式方法。)

为什么要先扔? 安全和调试。

  • 安全性:不允许在敏感位置出现任何非法价值。 (使内部算法更确定自己在做什么和拥有什么)。
  • 调试:使程序在发生意外情况时快速死亡。