繼續上一建議的問題,我們解決了覆寫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;
}