2

次の構文で奇妙な問題が発生しています。

次のコード ブロックは、null ポインター例外をスローしません。

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

ここで何が悪いのかわかりませんでした。読みやすさを除いて、2 つの呼び出しに違いはありません。

4

4 に答える 4

6

FacesContext.getCurrentInstance().getExternalContext().getRequestHeaderMap().get("faces-request")無効である。動作するバージョンは、等しいが逆になっているために機能します。2つの操作は次のように要約されます。

null.equals(object)

また

object.equals(null)

1つ目は、をスローしNullPointerException、2つ目はfalseに評価します。

于 2013-01-28T15:08:11.233 に答える
2

2つは異なる順序で物事を行います。x.equals(y)との違いのようなものy.equals(x)です。nullの場合y、そのうちの2番目のみがNPEをスローします。あなたの場合、requestHeaderMap.get("faces-request")はnullです。

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

これは true です。

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 に答える