直接使用 null.equals(任意对象) 会抛出 nullpointerexception,因为 null 不是对象,无法调用非静态的 equals 实例方法;正确做法是用 "常量".equals(变量)、objects.equals(a, b) 或先判空再调用。

直接用 null.equals(任意对象) 会抛出 NullPointerException(空指针异常)。
为什么 null 调用 equals 会报错
null 不是指向任何对象的引用,它没有实例,也没有方法可调用。而 equals() 是 Object 类的非静态实例方法,必须由真实对象来调用。一旦让 null 去调这个方法,JVM 就找不到接收者,立刻崩溃。
-
String s = null; s.equals("abc");→ 报错 -
Integer i = null; i.equals(42);→ 报错 -
new Object().equals(null);→ 不报错(正常执行,返回 false)
正确比较 null 和对象是否“逻辑相等”
不能靠 null.equals(obj),但有几种安全写法:
- 用常量或已知非空对象调用:
"abc".equals(s)—— 若s为 null,直接返回false - 用
Objects.equals(a, b)(推荐):Objects.equals(s, "abc")—— 内部自动判空,null 与任何值(包括另一个 null)比较都返回false,仅当两者都非 null 且内容相等时才返回true - 手动判空:
s != null && s.equals("abc")
null 与 null 用 equals 比较结果是?
Objects.equals(null, null) 返回 true;但 null.equals(null) 仍会报错(因为左边是 null,无法调用方法)。
注意:null == null 是合法且返回 true 的,这是唯一允许直接用 == 判断 null 的场景。
自定义类中重写 equals 时怎么处理 null
标准写法里,第一句通常就是 if (obj == null) return false;,或者更常见的是先检查类型再强制转换前判空:
if (this == obj) return true;if (obj == null || getClass() != obj.getClass()) return false;- 后续再用
Objects.equals(field, other.field)安全比较字段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











