Java重写Point类equals方法时p3.equals(null)返回true如何解决?
问题根因
你当前的equals方法存在两处核心逻辑错误,直接导致p3.equals(null)返回true:
- 没有提前对入参
obj做空校验和类型校验:Java中允许将null强转为任意引用类型,所以Point p = (Point) obj;这行代码在入参为null时不会抛出异常,直到后续访问p.x才触发空指针异常。 - 捕获空指针异常后仅打印日志,没有返回false,代码最终会走到方法末尾的
return true;,因此调用equals(null)永远返回true,不满足测试要求。
另外你的现有实现如果传入非Point类型的对象时,强转步骤会直接抛出ClassCastException,也不符合equals方法的通用规范。
修复方案
重写equals方法时遵循Java规范的标准校验流程即可:
- 首先判断是否为同一内存对象,是则直接返回true
- 接着判断入参是否为null,或者入参类型和当前类不匹配,任意条件满足直接返回false
- 强转类型后再比较两个对象的属性值
完整修复后的equals方法代码
@Override public boolean equals(Object obj) { // 同一对象直接返回true if (this == obj) return true; // 入参为null或者类型不匹配直接返回false if (obj == null || getClass() != obj.getClass()) return false; // 到这一步可以安全强转,不会有空指针或者类型转换异常 Point point = (Point) obj; // 比较属性 return x == point.x && y == point.y; }
修复后既可以满足入参为null时返回false的要求,也兼容了所有equals方法的通用调用场景,两个测试用例都可以正常通过。
内容的提问来源于stack exchange,提问作者Zaid Fanek
相关产品推荐
相关产品推荐

