前两天琢磨比较两个对象是否相等的方法,代码如下:
@Override
public boolean equals(Object obj) {
if (obj == this) {
//如果两个对象是同一个对象,即返回true
return true;
} else if (obj.getClass() != this.getClass()) {
//如果另一个对象和本对象类型不一样,即返回false
return false;
}
KeQian4_2 a = (KeQian4_2) obj;
if (this.name.equals(a.name) && this.age == a.age && this.gender == a.gender) {
//对比字段是否相同
return true;
}
return false;
}
结果:
Exception in thread "main" java.lang.NullPointerException
嗨呀呀,令人窒息,怎么就空指针异常了,于是我百度了一下,做了如下实验:
public class Test {
public static void main(String[] args) {
String a = null;
System.out.println("Andy".equals(null));
System.out.println(a.equals("Andy"));
}
}
结果:
false
Exception in thread "main" java.lang.NullPointerException
at PintA.Test.main(Test.java:15)
经过一番思考,得出如下结论:
null不是String类型的对象,调用不了String重写过得equals方法,如果强行调用,报错。
有了这个结论,最上面的错误也迎刃而解,w的name值是null,调用不了equals方法,所以出错。
将判断name是否为null的语句加到程序里就OK了:
@Override
public boolean equals(Object obj) {
if (obj == this) {
//如果两个对象是同一个对象,即返回true
return true;
} else if (obj.getClass() != this.getClass()) {
//如果另一个对象和本对象类型不一样,即返回false
return false;
}
KeQian4_2 a = (KeQian4_2) obj;
if (this.name == null) {
if (a.name != null) {
return false;
}
}
else if (this.name.equals(a.name) && this.age == a.age && this.gender == a.gender) {
//对比字段是否相同
return true;
}
return false;
}