我在使用以下语法时遇到了一个奇怪的问题:
以下代码块不会抛出空指针异常
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")
我无法弄清楚这里有什么问题。除了可读性之外,我认为两个电话之间没有任何区别。
答案 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")
可以返回null
而null.equals("partial/ajax")
会抛出异常。
但是,即使将"partial/ajax".equals(...)
与null
进行比较,Joda
也不会抛出异常。
在我的个人观察中,这是{{1}}构造的唯一优点。