2

我对以下语法有一个奇怪的问题:

以下代码块不会抛出空指针异常

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")

我只是无法弄清楚这里出了什么问题。除了可读性之外,我看不出两个调用之间有任何区别。

4

4 回答 4

6

FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap().get("faces-request")一片空白。您的版本之所以有效,是因为您将等号反转,这两个操作归结为:

null.equals(object)

或者

object.equals(null)

第一个抛出 a NullPointerException,第二个评估为 false。

于 2013-01-28T15:08:11.233 回答
2

两者以不同的顺序做事。x.equals(y)这就像和之间的区别y.equals(x)。如果y为 null,则只有其中的第二个会抛出 NPE。在您的情况下,requestHeaderMap.get("faces-request")为空。

这不会引发异常,因为 *.equals(null) 非常好:

"partial/ajax".equals(requestHeaderMap.get("faces-request")

另一方面,这是试图取消引用 null:

getRequestHeaderMap().get("faces-request").equals("partial/ajax")
于 2013-01-28T15:07:02.423 回答
1
if(!"partial/ajax".equals(requestHeaderMap.get("faces-request")))  

是真的,因为这意味着

if( !("partial/ajax".equals(null)).



如果你试试

null.equals("partial/ajax")

这将引发异常。

于 2013-01-28T15:11:46.903 回答
0

这是因为getRequestHeaderMap().get("faces-request")可以返回nullnull.equals("partial/ajax")抛出异常选项。

但是,"partial/ajax".equals(...)永远不会抛出异常,即使它正在与null.

在我个人看来,这是这个结构唯一的好处Joda

于 2013-01-28T15:08:01.037 回答