当前位置: 首页 > 知识库问答 >
问题:

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

孔冥夜
2023-03-14

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

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

但是,如果null对象被取消引用,则仍然会引发nullPointerException。那么,为什么要进行额外的空检查并抛出NullPointerException呢?

一个明显的答案(或好处)是它使代码更易读,我同意。我很想知道在方法开头使用objects.requirenonnull()的其他原因。

共有1个答案

黎苑博
2023-03-14

因为这样做可以使事情变得明确。如:

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对象,明天调用一个使用该字段并抛出的方法。最有可能的是,明天您将不知道为什么该引用昨天被传递给构造函数时是空的!

换句话说:通过显式地使用此方法检查传入的引用,您可以控制抛出异常的时间点。而很多时候,你想以最快的速度失败!

主要优点是:

  • 如前所述,受控行为
  • 更容易调试--因为您在创建对象的上下文中抛出。在某个时间点,您的日志/跟踪有一定的机会告诉您哪里出了问题!
  • 如上所示:这个想法的真正力量与最终领域结合在一起展开。因为现在您的类中的任何其他代码都可以安全地假定bar不是空的--因此您不需要在其他地方进行任何if(bar==null)检查!
 类似资料:
  • 问题内容: 我注意到,Oracle JDK中使用了许多Java 8方法,如果给定的对象(参数)为,则会在内部抛出该方法。 但是,如果取消引用对象,则将被抛出。那么,为什么要做这个额外的null检查并抛出 ? 一个明显的答案(或好处)是它使代码更具可读性,我同意。我很想知道在方法开始时使用的其他原因 。 问题答案: 因为您可以这样做使事情变得 明确 。喜欢: 或更短: 现在您 知道了 : 当 成功使

  • 本文向大家介绍为什么要使用 kafka,为什么要使用消息队列?相关面试题,主要包含被问及为什么要使用 kafka,为什么要使用消息队列?时的应答技巧和注意事项,需要的朋友参考一下 缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。 解耦和扩展性:项目开始的

  • 问题内容: 我是Mockito的新手,我已经开始学习它。但是我有一些疑问。为什么我们需要使用Mockito?据我所知,它用于模拟(创建虚拟对象)并在具有实际运行代码之前编写测试用例。但是,如果我想测试已经实施的代码以检查它们是否正常运行,该怎么办。我如何使用Mockito进行测试? 例如,我有CRUD方法,我想通过使用我的Create方法在数据库中实际插入数据来测试Create是否正常运行,这与其

  • 本文向大家介绍为什么要使用RabbitMQ?相关面试题,主要包含被问及为什么要使用RabbitMQ?时的应答技巧和注意事项,需要的朋友参考一下 可靠性(Reliability) RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。 灵活的路由(Flexible Routing) 在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已

  • 问题内容: 为什么我们要使用方法设置参数,因为我们可以通过在中设置参数并使用来获取参数来完成同样的事情? 问题答案: 是动态的,其可以被设置和复位运行期间。 所指定的是静态的,在应用程序的生命周期内不会更改。 例: 数据库属性,例如数据库名称配置属性。它将主要配置为上下文 并且,如果要设置基于运行时更改派生的属性值,则上下文属性应为“上次登录的用户”或“失败次数”。

  • 本文向大家介绍为什么要使用 hibernate?相关面试题,主要包含被问及为什么要使用 hibernate?时的应答技巧和注意事项,需要的朋友参考一下 hibernate 是对 jdbc 的封装,大大简化了数据访问层的繁琐的重复性代码。 hibernate 是一个优秀的 ORM 实现,很多程度上简化了 DAO 层的编码功能。 可以很方便的进行数据库的移植工作。 提供了缓存机制,是程序执行更改的高效