簡體   English   中英

平等問題在等於比較

[英]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")可以返回nullnull.equals("partial/ajax")會拋出異常。

但是, "partial/ajax".equals(...)永遠不會拋出異常,即使它與null進行比較。

在我個人的觀察中,這是Joda構造的唯一好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM