You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java重写Point类equals方法时p3.equals(null)返回true如何解决?

问题根因

你当前的equals方法存在两处核心逻辑错误,直接导致p3.equals(null)返回true:

  1. 没有提前对入参obj做空校验和类型校验:Java中允许将null强转为任意引用类型,所以Point p = (Point) obj;这行代码在入参为null时不会抛出异常,直到后续访问p.x才触发空指针异常。
  2. 捕获空指针异常后仅打印日志,没有返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:06:11