Objects.requireNonNull 是 Java 构造方法中推荐的非空校验方式,它在参数为 null 时立即抛出带提示的 NullPointerException,确保对象不被非法创建;适用于所有引用类型,配合 final 字段实现不可变设计,比手动 if 判空或 assert 更简洁可靠。

在 Java 构造方法中用 Objects.requireNonNull 做非空校验,是最常用、简洁且语义清晰的方式——它会在参数为 null 时立即抛出 NullPointerException,并可附带自定义提示信息,避免对象处于不一致状态。
直接在构造方法参数赋值前校验
这是最典型用法:对每个可能为 null 的引用类型参数,调用 requireNonNull 进行检查,再赋值给成员变量。校验失败时抛异常,对象不会被创建。
- 校验后直接赋值,逻辑连贯,不易遗漏
- 推荐使用带消息的重载版本,便于定位问题
- 适用于所有引用类型(String、List、自定义对象等),不适用于基本类型
示例:
public class User {
private final String name;
private final List<String> roles;
public User(String name, List<String> roles) {
this.name = Objects.requireNonNull(name, "name must not be null");
this.roles = Objects.requireNonNull(roles, "roles must not be null");
}
}
配合 final 字段和不可变设计
当类设计为不可变(immutable)时,构造阶段是唯一能确保字段非空的机会。requireNonNull 与 final 字段天然契合,既保证初始化安全,又防止后续被篡改。
立即学习“Java免费学习笔记(深入)”;
- 如果字段声明为
final,必须在构造方法内完成赋值,此时校验位置非常明确 - 避免在 setter 或其他方法里重复校验,专注构造时把关
- 若允许后续修改(如非 final 字段),需在每次设值时重新校验,不能只靠构造一次
与 Lombok @NonNull 配合使用(可选)
Lombok 的 @NonNull 注解会在编译期自动插入 requireNonNull 调用,减少样板代码,但本质逻辑一致。
- 加在参数上:
public User(@NonNull String name, @NonNull List<String> roles) - 生成的字节码里仍调用
Objects.requireNonNull,行为完全相同 - 注意:IDE 和静态检查工具(如 IntelliJ、SpotBugs)也能识别该注解并提供警告
不建议的替代写法
手动 if (x == null) throw new NullPointerException(...) 虽然可行,但冗长且易出错(比如漏写异常消息、拼错类名)。而 requireNonNull 是 JDK 标准 API,零依赖、语义明确、JVM 可能优化,更可靠。
- 不要用
assert x != null—— 断言默认关闭,无法保障运行时校验 - 避免延迟校验(如首次访问字段时才检查),会增加类状态复杂度
- 不要在构造方法末尾统一校验——一旦前面已赋值
null,对象已处于非法状态


















