Objects#requireNonNull的目的是什么?

Jux*_*hin 16 java

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

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

抛出: NullPointerException - 如果obj为null


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

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

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

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


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

tl; dr - 为什么你会使用不接收消息的重载.

Jes*_*per 29

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

如果你传递null给一个不应该接收的方法null,那么NullPointerException可能会发生某种情况,正如你已经注意到的那样.但是,异常可能不会发生,直到一些方法进一步下降,并且当它发生在内部深处时,找到错误的确切来源将更加困难.

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

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

  • @RaphaelMoita 指示参数无效的标准异常是“IllegalArgumentException”。`Objects.requireNonNull(...)` 的设计者选择使用 `NullPointerException` 来代替...... (2认同)