首页 » 编写高质量代码:改善Java程序的151个建议 » 编写高质量代码:改善Java程序的151个建议全文在线阅读

《编写高质量代码:改善Java程序的151个建议》建议46:equals应该考虑null值情景

关灯直达底部

继续上一建议的问题,我们解决了覆写equals的自反性问题,是不是就很完美了呢?再把main方法重构一下:


public static void main(Stringargs){

Person p1=new Person("张三");

Person p2=new Person(null);

/*其他部分没有任何修改,不再赘述*/

}


很小的改动,那运行结果是什么呢?是两个true吗?我们来看运行结果:


列表中是否包含张三:true

Exception in thread"main"java.lang.NullPointerException


竟然抛异常了!为什么p1就能在List中检查一遍,并且执行p1.equals方法,而到了p2就开始报错了呢?仔细分析一下程序,马上明白了:当执行到p2.equals(p1)时,由于p2的name是一个null值,所以调用name.equalsIgnoreCase方法时就会报空指针异常了!出现这种情形是因为覆写equals没有遵循对称性原则:对于任何引用x和y的情形,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。

问题知道了,解决也很简单,增加name是否为空进行判断即可,修改后的equals代码如下:


public boolean equals(Object obj){

if(obj instanceof Person){

Person p=(Person)obj;

if(p.getName()==null||name==null){

return false;

}else{

return name.equalsIgnoreCase(p.getName());

}

}

return false;

}