objects.requirenonnull 是 java 7 引入的 objects 工具类静态方法,用于非空校验并返回原对象,解决手动判空冗长、异常信息缺失和易漏返回值问题,支持自定义提示与延迟消息构造。

Objects.requireNonNull 是 Java 7 引入的工具方法,用于在运行时主动检查对象引用是否为 null,并抛出清晰的 NullPointerException(NPE)。它不是 Object 类的成员方法,而是 java.util.Objects 工具类中的静态方法——这点常被误解。但它与 Object 类紧密协作,是实现“非空参数强制断言”的标准、简洁且语义明确的方式。
为什么不用直接 if (obj == null) throw new NullPointerException()?
手动判空虽然可行,但存在三个明显问题:
- 代码冗长,重复模板多,降低可读性
- 默认异常信息不包含参数名,调试困难(如
java.lang.NullPointerException没有上下文) - 容易遗漏返回值,导致后续逻辑误用 null
Objects.requireNonNull 一次性解决以上问题:它既校验又返回原对象,天然支持“链式断言 + 使用”模式。
核心用法:两种重载形式
推荐始终使用带 message 的重载,便于定位问题:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Objects.requireNonNull(T obj)—— 仅校验,抛出无参 NPE(信息为"null") -
Objects.requireNonNull(T obj, String message)—— 校验 + 自定义提示,如"name must not be null" - Java 12+ 还支持
requireNonNull(T obj, Supplier<string> messageSupplier)</string>,延迟构造消息,适合开销大的场景
示例:
public Person(String name, Integer age) {
this.name = Objects.requireNonNull(name, "name cannot be null");
this.age = Objects.requireNonNull(age, "age cannot be null");
}
构造后 this.name 和 this.age 必然非 null,后续代码可安全调用 name.length() 或 age.intValue()。
配合现代 Java 特性提升表达力
该方法天然适配以下常见场景:
- 记录类(record)构造逻辑:虽 record 不允许自定义构造器,但在组件验证或封装工厂方法中仍需断言
-
Stream 处理前过滤 null:如
list.stream().map(Objects::requireNonNull).collect(...),快速失败而非静默跳过 -
Builder 模式参数校验:在
build()方法中统一断言必填字段,避免对象处于非法中间状态 -
与 Optional 协作:当明确要求非空时,
Optional.of(...)内部也调用requireNonNull,语义更精准
注意边界与常见误区
几个关键细节需留意:
- 它只检查引用是否为
null,不检查字符串内容(如"")、集合是否为空、数组长度等,需额外判断 - 不要在循环体内高频调用(如遍历百万元素每次 check),除非业务强依赖即时失败;否则考虑批量预检
- 不可用于基本类型(
int,boolean等),它们本身不能为 null;包装类型(Integer,Boolean)才适用 - 若方法声明了
@NotNull注解(如 JetBrains 或 Checker Framework),requireNonNull是运行时对静态契约的落地保障
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










