Objects.requireNonNull 是 Java 中用于构造函数内即时校验必填参数是否为 null 的工具方法,应在字段赋值前调用并提供明确提示信息,支持多参数链式校验,配合 final 字段可保障对象不可变性与初始化安全。

Objects.requireNonNull 是 Java 中用于快速校验参数是否为 null 的工具方法,它在构造函数中被广泛用来确保对象创建时关键字段不为空,一旦为 null 就立即抛出 NullPointerException,避免后续运行时出现难以定位的空指针问题。
在构造函数中直接校验参数
最常见也最推荐的方式,是在构造函数的参数接收后、字段赋值前,用 Objects.requireNonNull 检查必填参数。它会立即抛出带提示信息的 NullPointerException,且异常堆栈清晰指向构造处。
- 写法示例:
public Person(String name, int age) {
this.name = Objects.requireNonNull(name, "name cannot be null");
this.age = age;
} - 如果传入
new Person(null, 25),会立刻抛出:
java.lang.NullPointerException: name cannot be null - 注意:校验应在字段赋值前执行,否则即使校验失败,部分字段可能已被赋值,导致对象处于不一致状态。
校验多个参数时可链式调用
一个构造函数常需校验多个非空字段,可以连续调用 requireNonNull,每个都独立判断并提供对应提示。
- 例如:
public Order(String orderId, String customerId, List- items) {
this.orderId = Objects.requireNonNull(orderId, "orderId is required");
this.customerId = Objects.requireNonNull(customerId, "customerId is required");
this.items = Objects.requireNonNull(items, "items list cannot be null");
} - items) {
- 这样能精准定位是哪个参数为空,比统一判空再抛异常更利于调试和维护。
配合 final 字段保证不可变性
若字段声明为 final,必须在构造过程中完成初始化;此时用 requireNonNull 校验后再赋值,既能满足编译要求,又能保障非空约束。
立即学习“Java免费学习笔记(深入)”;
- private final String id;
public Entity(String id) {
this.id = Objects.requireNonNull(id, "id must not be null");
} - 这种写法天然契合不可变对象设计,同时让空值检查成为构造逻辑的一部分,而非事后补救。
避免在 setter 或业务方法里替代构造校验
虽然 requireNonNull 也可用在 setter 中,但构造时校验才是防御性编程的第一道防线。一旦对象成功构建,就应默认其核心字段有效。
- 如果只在 setter 中校验,而构造时允许
null,可能导致对象处于“半初始化”状态,增加出错概率。 - 尤其在多线程或序列化场景下,绕过构造函数的对象(如反射、反序列化)可能跳过校验,所以构造时强校验 + 不可变字段是最稳妥组合。


















