8

init(ServletConfig config) メソッドをオーバーライドしようとしています。私のコードは次のとおりです。

 public void init(ServletConfig config) throws ServletException {
    ServletContext sc = getServletContext(); // ----- NullPointerException
}

これは NullPointerException を与えています。

次のように変更した場合:

   public void init(ServletConfig config) throws ServletException {
    ServletContext sc = config.getServletContext(); // ----- works fine
}

これはうまくいきます。init(ServletConfig config) ではなく init() メソッドをオーバーライドする必要があることはわかっていますが
、なぜこれが起こっているのか、誰かに適切な理由を教えてもらえますか?

4

4 に答える 4

20

のドキュメントを比較してくださいinit(ServletConfig):

public void init(ServletConfig config) が ServletException をスローする
サーブレットコンテナによって呼び出され、サーブレットにサーブレットが
就役中です。

Servlet#init を参照してください。この実装は ServletConfig オブジェクトを格納します
後で使用するためにサーブレット コンテナから受け取ります。オーバーライド時
この形式のメソッドは、super.init(config) を呼び出します。

そして、それを のドキュメントと比較してくださいinit():

public void init() は ServletException をスローします
必要がないようにオーバーライドできる便利なメソッド
super.init(config) を呼び出します。

init(ServletConfig) をオーバーライドする代わりに、このメソッドを単純にオーバーライドします
GenericServlet.init(ServletConfig config) によって呼び出されます。の
ServletConfig オブジェクトは、引き続き getServletConfig() を介して取得できます。

をオーバーライドする場合init(ServletConfig)、最初に行う必要があるのは、次の呼び出しです。

super.init(config);

これを行うとgetServletContext()、メソッド内で を直接呼び出しても NPE が発生しなくなります。

于 2012-11-30T04:40:41.463 に答える
2

これは、間違ったメソッドメカニズムをオーバーライドしているために発生します。

     public void init(ServletConfig config) throws ServletException {
        super.init(config);
            ServletContext sc = getServletContext(); 
     }

をオーバーライドする代わりにinit(ServletConfig)、以下のメソッドをオーバーライドするだけで、次のように呼び出されます。GenericServlet.init(ServletConfig config)

 public void init() throws ServletException {
 ServletContext sc = getServletContext(); 
}
于 2012-11-30T04:43:28.673 に答える
1

なぜなら:

public void init(ServletConfig config) throws ServletException
{
    ServletContext sc = getServletContext();
}

を呼び出さないでくださいsuper.init(ServletConfig)。その結果、ServletConfigはサーブレットインスタンスに保存されず、getServletConfigへの後続の呼び出しはnullを返します。

于 2012-11-30T04:41:23.647 に答える
0

オーバーライドされたメソッドの最初の行に super init(config) を置くだけです

public void init(ServletConfig config) throws ServletException
于 2014-06-05T05:50:32.943 に答える