【问题标题】:What is the purpose of Objects#requireNonNull对象的目的是什么#requireNonNull
【发布时间】:2015-02-15 03:30:48
【问题描述】:

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

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

抛出: NullPointerException - 如果 obj 为空


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

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

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

因此,我可以将特定信息与 NPE 一起打印,从而使调试变得非常容易。


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

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

【问题讨论】:

  • 您的实际问题是什么?您已经自己回答了标题中提出的问题。
  • @Radiodef Sotirios Delimanolis 总结得最好——“我认为,从身体上看,问题是你为什么要使用不需要消息的重载。”
  • 你应该编辑你的问题来澄清。
  • 好的,已经添加了。

标签: java


【解决方案1】:

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

如果您将null 传递给不应接收null 的方法,则NullPointerException 可能会发生在某个地方,正如您已经注意到的那样。但是,异常可能要到更深层次的一些方法才会发生,当它发生在更深层次的某个地方时,将更难找到错误的确切来源。

因此,最好是方法预先检查其参数,并在发现无效值(例如 null)时立即抛出异常。

edit - 关于单参数版本:即使您不会提供错误消息,但检查参数并尽早抛出异常将比让 null 传递到直到一个异常发生在更深的地方。堆栈跟踪将指向您使用Objects.requireNonNull(...) 的行,作为开发人员,您应该很明显这意味着您不应该传递null。当您让 NullPointerException 隐式发生时,您不知道原始程序员是否有意使变量不应该是 null

【讨论】:

  • 我认为,从正文来看,你为什么要使用不带消息的重载。
  • 我完全同意尽早发现错误的原则,但是抛出 NullPointerException 对我来说听起来很奇怪。如果您花时间检查它,我认为您可以抛出更友好的异常,例如 InvalidParmeterException 或类似的东西。
  • @RaphaelMoita 表示参数无效的标准例外是IllegalArgumentExceptionObjects.requireNonNull(...) 的设计者选择使用NullPointerException 代替...
  • @Jesper 你明白我的意思! IllegalArgumentException 会更有意义!
  • 是否有任何理由不让开发人员选择抛出异常的重载?
【解决方案2】:

这是一种实用方法。只是一个捷径! (捷径设计师有他们的捷径风格)。

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

  • 安全性:不允许在敏感位置出现任何非法值。 (让内部算法更确定他们在做什么以及他们拥有什么)。
  • 调试:让程序在发生意外情况时快速终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 2018-11-29
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2018-06-24
    相关资源
    最近更新 更多