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() 方法而不是 init(ServletConfig config) 但是
任何人都可以给我正确的理由来解释为什么会发生这种情况吗?

4

4 回答 4

20

比较文档init(ServletConfig)

公共无效初始化(ServletConfig 配置)抛出 ServletException
由 servlet 容器调用以向 servlet 指示 servlet
正在投入使用。

请参阅 Servlet#init。此实现存储 ServletConfig 对象
它从 servlet 容器接收以供以后使用。覆盖时
这种形式的方法,调用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 没有存储在 servlet 实例中,后续调用 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 回答