《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
相关产品推荐
相关产品推荐

