Eclipse中HttpServlet报NullPointerException求助及web.xml使用疑问
解决你的NullPointerException与Web配置疑问
嘿,我来帮你一步步排查问题,先解决最头疼的空指针异常,再回答你关于web.xml的疑问!
一、为什么会出现NullPointerException?
从报错信息看,异常出现在controller.AadharRegistration.doGet方法的第26行,对应你代码里的这一行:
if (fno.equals("1")) {
问题很明确:request.getParameter("formd")返回了null,你直接调用equals()方法就触发了空指针异常。
修复方案
安全的字符串比较方式
把字符串常量放在前面调用equals,这样即使fno是null也不会报错:String fno = request.getParameter("formd"); // 推荐写法:用常量字符串调用equals if ("1".equals(fno)) { // form1的处理逻辑 } // 或者先判断fno不为null再比较 if (fno != null && fno.equals("2")) { // form2的处理逻辑 }这样就能避免空指针,同时也能处理用户直接访问Servlet(没有带formd参数)的情况。
Session的潜在风险
如果用户直接访问form2或form3并提交,Session里的name、fname等属性会是null,到form3插入数据库时也会触发空指针。建议获取Session时确保它存在:// 传入true表示如果Session不存在则创建新的 HttpSession httpsession = request.getSession(true);另外在form3的处理逻辑里,可以先检查Session属性是否存在,比如:
String name = (String) httpsession.getAttribute("name"); if (name == null) { out.println("<font color='red'><h1>请先完成第一步注册!</h1>"); return; // 终止后续逻辑 }数据库资源泄漏问题
你的代码没有关闭Connection和PreparedStatement,这会导致数据库连接泄漏,建议在finally块中统一关闭资源:Connection conn = null; PreparedStatement ps = null; try { Class.forName("oracle.jdbc.OracleDriver"); conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:p1aor01", "system", "sysdba"); ps = conn.prepareStatement("insert into aadhar values (?,?,?,?,?,?,?,?)"); // ... 赋值与执行逻辑 } catch (SQLException e) { out.println("<font color='red'><h1>Registration exception Failed!</h1>"); e.printStackTrace(); } catch (ClassNotFoundException xe) { xe.printStackTrace(); } finally { // 关闭资源,避免泄漏 try { if (ps != null) ps.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } }
二、Dynamic Web Module 3.1还能使用web.xml吗?
当然可以!Dynamic Web Module 3.1同时支持传统web.xml配置和注解式配置(比如@WebServlet),两者可以共存,完全根据你的习惯选择。
- 如果你喜欢用web.xml,保持现有配置就好,没有任何问题;
- 如果想简化配置,可以在Servlet类上添加注解替代web.xml中的配置:
这样就可以删除web.xml里对应的@WebServlet("/registration") public class AadharRegistration extends HttpServlet { // ... 原有代码 }servlet和servlet-mapping节点了。
三、调试小技巧
- 可以在Servlet里添加打印语句,查看
formd参数的实际值:System.out.println("当前formd参数值:" + fno); - 用IDE的调试功能,在空指针出现的行设置断点,运行时观察变量值,快速定位问题;
- 提交表单后,查看浏览器地址栏的URL,确认
formd参数是否正常携带(比如form1提交后URL应该包含?formd=1&name=xxx...)。
内容的提问来源于stack exchange,提问作者aloneonthe_edge
相关产品推荐
相关产品推荐

