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

Eclipse中HttpServlet报NullPointerException求助及web.xml使用疑问

解决你的NullPointerException与Web配置疑问

嘿,我来帮你一步步排查问题,先解决最头疼的空指针异常,再回答你关于web.xml的疑问!

一、为什么会出现NullPointerException?

从报错信息看,异常出现在controller.AadharRegistration.doGet方法的第26行,对应你代码里的这一行:

if (fno.equals("1")) {

问题很明确:request.getParameter("formd")返回了null,你直接调用equals()方法就触发了空指针异常。

修复方案

  1. 安全的字符串比较方式
    把字符串常量放在前面调用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参数)的情况。

  2. 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; // 终止后续逻辑
    }
    
  3. 数据库资源泄漏问题
    你的代码没有关闭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中的配置:
    @WebServlet("/registration")
    public class AadharRegistration extends HttpServlet {
        // ... 原有代码
    }
    
    这样就可以删除web.xml里对应的servlet和servlet-mapping节点了。

三、调试小技巧

  • 可以在Servlet里添加打印语句,查看formd参数的实际值:
    System.out.println("当前formd参数值:" + fno);
    
  • 用IDE的调试功能,在空指针出现的行设置断点,运行时观察变量值,快速定位问题;
  • 提交表单后,查看浏览器地址栏的URL,确认formd参数是否正常携带(比如form1提交后URL应该包含?formd=1&name=xxx...)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:55:53