【发布时间】:2022-01-02 22:56:12
【问题描述】:
我接到了一项任务,但我不知道如何让它发挥作用。所有的测试用例都必须通过。
Assertions.assertDoesNotThrow(() -> p3.equals(null));
Assertions.assertFalse(p3.equals(null), "equals to null should return false");
我发现了第一个,欺骗我的是 Assertions.assertfalse(p3.equals(null))。 我从 Point 这样创建了对象 p3:
Point p3 = new Point(x+1, y-1);
在我的 Point 类中,我有一个 equals 方法,我将其重写为:
@Override
public boolean equals(Object obj) {
Point p = (Point) obj;
try {
if (x != p.x) {
return false;
}
if (y != p.y) {
return false;
}
} catch (NullPointerException e) {
System.err.println("null");
}
return true;
}
我用它来通过其他未提及的测试。
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int x() {
return x;
}
public int y() {
return y;
}
其中 x 和 y 是 0-30 之间的随机整数。
当我运行测试时,它总是返回等于 null 的 p3,这让我很困惑。我知道这与检查通过的对象是否属于相同类型(点)和向下转换有关,但我不确定。
【问题讨论】:
-
一个对象实例化表达式 (
new ...) 永远不会返回null如果它没有任何异常地完成。我担心,我不明白这个问题。 -
附带说明,检查
p3.equals(null)没有任何意义。如果变量为空,则表达式抛出 NPE。如果它不为空,那么它总是评估为false。 -
@Seelenvirtuose 也许是为第二部分编写测试。所以这只是在
Point.equals(Object other)方法中检查if(!(other instanceof Point)) return false;的问题。 -
不要在
equals方法中捕获 NPE! -
试试
return obj instanceof Point p && p.x == x && p.y == y;
标签: java object nullpointerexception null downcast