1
A)         FacesContext facesContext = FacesContext.getCurrentInstance();
           ExternalContext externalContext=facesContext.getExternalContext();
           HttpSession session = (HttpSession) externalContext.getSession(false);

               if(session.isNew()) {            //  java.lang.NullPointerException

B)         HttpServletRequest req1 = (HttpServletRequest)FacesContext.getCurrentInstance()
                                    .getExternalContext().getRequest();
           HttpSession session1=req1.getSession();

             if(session1.isNew()) {            // no Exception

ケース A が NullPointerException をスローしているのに、ケース B がそうでない理由。

4

2 に答える 2

6

まず、いつなぜaNullPointerExceptionがスローされたかを理解することが重要です。あなたの質問の仕方は、あなたがそれを理解していないことを示しています。「なぜスローするNullPointerExceptionのですか?」と尋ねました。「なぜ戻るnullのですか?」と尋ねませんでした。

javadocが示すように、変数にアクセスしようとしたり、実際には であるオブジェクト参照でピリオド演算子を使用してメソッドを呼び出そうとすると、がNullPointerExceptionスローさ.ます。 null

例えば

SomeObject someObject = null;
someObject.doSomething(); // NullPointerException!

isNew()特定のケースでは、nullオブジェクトでメソッドを呼び出そうとしていました。したがって、これは不可能です。参照にはnullメソッドがまったくありません。それは単に何も指していません。代わりに null チェックを行う必要があります。

HttpSession session = (HttpSession) externalContext.getSession(false);

if (session == null) {
    // There's no session been created during current nor previous requests.
}
else if (session.isNew()) {
    // The session has been created during the current request.
}
else {
    // The session has been created during one of the previous requests.
}

つまり、引数を指定したgetSession()呼び出しは、セッションがまだ作成されていないときに戻る可能性があります。javadocも参照してください。falsenull

getSession

public abstract java.lang.Object getSession(boolean create)

createパラメータがの場合、true(必要に応じて) 現在のリクエストに関連付けられたセッション インスタンスを作成して返します。パラメータcreatefalse現在のリクエストに関連付けられた既存のセッション インスタンスを返す場合、またはそのnullようなセッションがない場合は戻ります。

強調された部分を参照してください。

HttpServletRequest#getSession()引数を取らない呼び出しは、デフォルトで引数として使用しtrueますcreatejavadocも参照してください。

getSession

HttpSession getSession()

このリクエストに関連付けられた現在のセッションを返すか、リクエストにセッションがない場合は作成します

強調された部分を参照してください。

Javadocs をよりよく参照するためのヒントとして、これを利用していただければ幸いです。クラスとメソッドが何をするかを非常に正確に説明しているため、多くの場合、質問に対する回答がすでに含まれています。

于 2012-10-27T11:29:25.077 に答える
1

getSession()のデフォルトは、現在のセッションがない場合に新しいセッションを作成することです。

getSession(false)を使用すると、アクティブなセッションがない場合にnullを返すようにこの動作が変更されます。

于 2012-10-27T11:07:53.393 に答える