Objects.requireNonNull用于主动拦截null实现“提前失败”,应在构造函数和setter中校验;Objects.equals安全处理null比较;Objects.hash和toString简化null字段处理;deepEquals仅对数组递归,非通用深比较。
Objects.requireNonNull 用来主动拦截 null,而不是被动等 NPE
Java 的空指针异常(NullPointerException)往往在深层调用中才暴露,堆栈难读、定位成本高。而 Objects.requireNonNull 的核心价值是「提前失败」:在参数入口处就校验,让问题出现在调用方代码行,而非某个内部方法深处。
常见误用是只在 public 方法里加校验,却忽略构造函数或 setter 中的字段赋值场景:
public class User {
private final String name;
public User(String name) {
this.name = Objects.requireNonNull(name, "name must not be null"); // ✅ 构造时就堵住 null
}
}
- 第二个参数(message)建议写具体字段名,避免泛泛写
"argument is null" - 若需返回默认值而非抛异常,用
Objects.requireNonNullElse,但注意它不校验默认值本身是否为 null - 对集合/数组元素判空?
Objects.requireNonNull不适用——它只检查引用本身,不递归检查内容
Objects.equals 比 == 和 obj.equals 安全得多
手写 a != null && a.equals(b) 容易漏掉 b 为 null 的情况,而 Objects.equals(a, b) 内部已处理所有 null 组合:两个都为 null → true;一个为 null → false;都不为 null → 调用 a.equals(b)。
典型踩坑场景:
立即学习“Java免费学习笔记(深入)”;