平等问题在等于比较

时间:2013-01-28 15:05:14

标签: java nullpointerexception equals

我在使用以下语法时遇到了一个奇怪的问题:

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

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 个答案:

答案 0 :(得分:6)

FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap().get("faces-request")为空。你的版本是有效的,因为你有等于逆转,这两个操作归结为:

null.equals(object)

object.equals(null)

第一个抛出NullPointerException,第二个抛出错误。

答案 1 :(得分:2)

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

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

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

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

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

答案 2 :(得分:1)

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

是真的,因为这意味着

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



如果你试试

null.equals("partial/ajax")

这将引发异常。

答案 3 :(得分:0)

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

但是,即使将"partial/ajax".equals(...)null进行比较,Joda也不会抛出异常。

在我的个人观察中,这是{{1}}构造的唯一优点。