讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議46:equals應該考慮null值情景 >

建議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;

}