You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《Murach's Java Servlets 第3版》ch12email项目写入数据库遇空指针异常

HTTP 500 NullPointerException in Murach's Java Servlets and JSP ch12email Project

我正在运行《Murach's Java Servlets and JSP 第3版》中的ch12email项目(可从murach.com下载),提交表单数据时遇到了HTTP Status 500错误,错误栈如下:

java.lang.NullPointerException 
murach.data.ConnectionPool.getConnection(ConnectionPool.java:32) 
murach.data.UserDB.emailExists(UserDB.java:80) 
murach.email.EmailListServlet.doPost(EmailListServlet.java:39) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:661) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

异常发生在ConnectionPool类的getConnection()方法,对应的代码如下:

public Connection getConnection() {
    try {
        return dataSource.getConnection();
    } catch (SQLException e) {
        System.out.println(e);
        return null;
    }
}

该类的构造方法如下:

private ConnectionPool() {
    try {
        InitialContext ic = new InitialContext();
        dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/murach"); 
        //dataSource = (DataSource) ic.lookup("jdbc/murach");
    } catch (NamingException e) {
        System.out.println(e);
    }
}

我已经能在NetBeans中正常连接数据库并查看、编辑数据,项目的context.xml里的数据库Resource配置如下:

<Resource name="jdbc/murach" 
          auth="Container" 
          driverClassName="com.mysql.jdbc.Driver" 
          url="jdbc:mysql://localhost:3306/murach" 
          username="root" 
          password="67890" 
          maxActive="100" 
          maxIdle="30" 
          maxWait="10000" 
          logAbandoned="true" 
          removeAbandoned="true" 
          removeAbandonedTimeout="60" 
          type="javax.sql.DataSource" />

不确定还需要哪些信息来排查问题,希望能得到帮助!

排查建议

  • 验证JNDI查找路径:虽然标准的JNDI lookup路径是java:/comp/env/jdbc/murach,但部分Tomcat版本或部署场景下,直接使用jdbc/murach(也就是你注释掉的那行)可能能正常工作,可以尝试替换后重新部署测试。
  • 检查驱动的存放位置:JDBC驱动必须放在Tomcat的lib目录下,而不是项目的WEB-INF/lib。因为容器管理的DataSource需要由Tomcat的类加载器加载驱动,否则会导致DataSource初始化失败,dataSource变量为null,最终触发NPE。
  • 确认context.xml的部署状态:如果是通过NetBeans部署项目,检查项目的META-INF/context.xml是否被正确同步到Tomcat的conf/Catalina/localhost目录下。可以尝试清理Tomcat的work目录和项目的编译缓存,然后重新部署。
  • 查看完整的控制台日志:你的构造方法中捕获NamingException后仅做了打印,查看Tomcat的控制台输出,确认是否有对应的异常信息,这能直接告诉你JNDI lookup时是否出现了资源找不到的问题。
  • 确认数据库连接状态:虽然NetBeans能连接数据库,但Tomcat运行时可能存在网络或服务状态变化,再确认下MySQL服务是否正常运行,端口、用户名密码是否和配置一致。

内容的提问来源于stack exchange,提问作者jederino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:03:23