说明:本文代码测试于:idea2018; tomcat 9.0


当我们通过IDEA自动生成init(ServletConfig config)方法时,默认创建一句调用父类init()方法的语句

    @Overridepublic void init(ServletConfig config) throws ServletException {super.init(config);}

但是调用父类的构造方法super.init(config);是必须的吗?如果我们将其删掉会怎样呢?

@WebServlet(name = "HelloServlet", urlPatterns = "/hello",initParams = {@WebInitParam(name = "hello2021", value = "123")}
)
public class HelloServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {System.out.println("hahaha");}// 为简化问题,不考虑 doPost() 方法protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取当前 Servlet 的 config 对象ServletConfig config = getServletConfig();// 输出当前 Servlet 程序的别名System.out.println(config.getServletName());}
}

浏览器访问HelloServlet项目,报错:

HTTP Status 500 – Internal Server Error
Type 异常报告描述 服务器遇到一个意外的情况,阻止它完成请求。Exceptionjava.lang.NullPointerExceptionchapter1.HelloServlet.doGet(HelloServlet.java:33)javax.servlet.http.HttpServlet.service(HttpServlet.java:634)javax.servlet.http.HttpServlet.service(HttpServlet.java:741)org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Note 主要问题的全部 stack 信息可以在 server logs 里查看

分析报错信息可知,报错的原因是:java.lang.NullPointerException,报错语句是:System.out.println(config.getServletName());

报错信息中提到HelloServlet.java:33,实际上就是该语句:System.out.println(config.getServletName());

缩小范围,可知是该语句引起的报错:config.getServletName(),结合报错类型是空指针异常,所以可以推断config的值为空。而config是由getServletConfig()方法返回的,查看getServletConfig()源代码

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {private transient ServletConfig config;public void init(ServletConfig config) throws ServletException {this.config = config;this.init();}public ServletConfig getServletConfig() {return this.config;}
}

简单说明一下,在自定义的Servlet项目中(本文即是HelloServlet),init(ServletConfig config)的父类方法是GenericServlet类中的构造方法,覆盖的getServletConfig()方法同样也是GenericServlet中的。读者可以直接查看源码验证。

综上可知,super.init(config);的作用是将config传入GenericServlet,初始化超类中的ServletConfig属性,以便能通过getServletConfig()方法在子类中获得config对象

根据Servlet程序的继承结构可知,自定义的Servlet程序的直接父类是HttpServletHttpServlet的父类是GenericServlet,而自定义的Servlet程序直接可以覆盖GenericServlet中的方法的原因是HttpServlet没对某些方法进行重写。


参考文章:

  1. servlet中的init方法中为什么总要有个super.init
  2. 尚硅谷最新版JavaWeb全套教程

为什么Servlet程序的init(ServletConfig config)中需要调用父类的init方法相关推荐

  1. python中子类调用父类的初始化方法

    http://bestchenwu.iteye.com/blog/1044848 http://www.crazyant.net/1303.html 一直不太理解python的初始化方法,今天找了下资 ...

  2. C#中子类调用父类的实现方法

    本文实例讲述了C#中实现子类调用父类的方法,分享给大家供大家参考之用.具体方法如下: public class Person {public Person(){Console.WriteLine(&q ...

  3. python子类如何调用父类方法_python中子类调用父类函数的方法示例

    前言 本文主要给大家介绍了关于python子类调用父类函数的相关内容,Python中子类中的__init__()函数会覆盖父类的函数,一些情况往往需要在子类里调用父类函数.下面话不多说了,来一起看看详 ...

  4. 【lombok】使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法...

    错误如题:使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法 报错如下: 解决方法: 1.首先查看你的lombok插件是否下载安 ...

  5. 线程的常用方法——currentThread方法||在main方法中直接调用run()方法,没有开启新的线程,以在run方法中的当前线程就是main线程||启动子线程,子线程会调用run方法

    线程的常用方法--currentThread方法 Thread.currentThread()方法可以获得当前线程 Java 中的任何一段代码都是执行在某个线程当中的. 执行当前代码的线程就是当前线程 ...

  6. 什么是python中子类父类_零基础入门:python中子类继承父类的__init__方法实例

    前言: 今天为大家带来的内容是零基础入门:python中子类继承父类的__init__方法实例!具有不错的参考意义,希望在此能够帮助到各位!(喜欢的话记得点赞转发关注不迷路哦) 使用Python写过面 ...

  7. c++中子类调用父类方法的方法

    在c++中子类调用父类方法的方法和java所用的方式不一样, java使用super指针就可以调用,c++中虽然也有this指针,但是不能用super去调用父类方法. c++用的方法为:fatherC ...

  8. mysql idataparameter_asp.net中IDataParameter调用存储过程的实现方法

    本文实例讲述了asp.net中IDataParameter调用存储过程的实现方法,是asp.net数据库程序设计中非常实用的技巧.分享给大家供大家参考. 具体实现方法如下: public string ...

  9. python程序运行时间计时软件_python中的计时器timeit的使用方法

    这篇文章主要介绍了关于python中的计时器timeit的使用方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 本文介绍了python中的计时器timeit的使用方法,分享给大家,具 ...

最新文章

  1. Gmapping从开始到放弃—写一个TF 广播
  2. 关于Java为什么配置好环境变量但是不能在命令行cmd运行javac的问题
  3. 深入浅出解释FFT(四)——fft分析信号频率和相位
  4. C 猴子选大王(亚瑟夫环)
  5. 听歌是怀念过去 - 潇洒的走
  6. jsoncpp-src-0.5.0.tar.gz 源码错误!!!!
  7. oracle高资源消耗sql,Oracle中定位重要(消耗资源多)的SQL
  8. Ubuntu下解决文件名mp3标签和文本文件内容的乱码问题
  9. mybatis动态列名
  10. 阿里人告诉你毕业3年,为何技术能力相差越来越大?
  11. WPF换肤之三:WPF中的WndProc
  12. Kotlin习惯用语和编码风格[转自Kotlin中文文档]
  13. java fn replace_JSTL fn:replace()函数替换 换行符
  14. JDBC Driver介绍
  15. python双人对决小游戏
  16. 基于知识图谱的智能问答机器人
  17. 计算Fisher信息之Part(二)
  18. Matlab文件列表实现自然排序的方法排序
  19. MatLab函数:pol2cart()
  20. 谷歌不支持调用摄像头麦克风_谷歌大手一挥,第三方相机或已无立锥之地

热门文章

  1. cmd中net start mysql发生系统错误5
  2. 通信原理最佳接收-最佳接收准则
  3. 创建mat二值图 matlab,OpenCV学习之路(二)——Mat对象
  4. java tic tac toe_请问我这个tic tac toe的游戏代码的问题在哪里
  5. netcore更新dll要停止_使 .NET Core 应用程序容器化
  6. python安装完后无法打开运行_安装Python完成后无法正确运行
  7. matlab产生时间数组以月为单位_Matlab中处理日期与时间的函数
  8. java异常在哪一层捕获_当在一个方法的代码中抛出一个检测异常时,该异常或被方法中的 ( )结构 捕获,或者在方法的 ( ) 中声明_学小易找答案...
  9. Qt中的QLineEdit、QTextEdit、QPlainTextEdit
  10. 自适应lasso_线性回归模型优化算法(Lasso)