[英]Strange issue in equals comparison
我對以下語法有一個奇怪的問題:
以下代碼塊不會拋出空指針異常
Map<String, String> requestHeaderMap = FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap();
if(!"partial/ajax".equals(requestHeaderMap.get("faces-request")))
{
System.out.println("This works");
}
但是這個拋出空指針異常:
FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap().get("faces-request").equals("partial/ajax")
我無法弄清楚這里有什么不對。 除了可讀性之外,我沒有看到兩個電話之間有任何區別。
FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap().get("faces-request")
為null。 你的版本是有效的,因為你有等於逆轉,這兩個操作歸結為:
null.equals(object)
要么
object.equals(null)
第一個拋出NullPointerException
,第二個拋出為false。
這兩個人以不同的順序做事。 這就像x.equals(y)
和y.equals(x)
之間的區別。 如果y
為null,則只有第二個將拋出NPE。 在您的情況下, requestHeaderMap.get("faces-request")
為null。
這不會拋出異常,因為* .equals(null)非常好:
"partial/ajax".equals(requestHeaderMap.get("faces-request")
另一方面,這是嘗試取消引用null:
getRequestHeaderMap().get("faces-request").equals("partial/ajax")
if(!"partial/ajax".equals(requestHeaderMap.get("faces-request")))
這是真的,因為這意味着
if( !("partial/ajax".equals(null)).
如果你試試
null.equals("partial/ajax")
這將引發異常。
這是因為getRequestHeaderMap().get("faces-request")
可以返回null
而null.equals("partial/ajax")
會拋出異常。
但是, "partial/ajax".equals(...)
永遠不會拋出異常,即使它與null
進行比較。
在我個人的觀察中,這是Joda
構造的唯一好處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.