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

Servlet请求转发时getAttribute()返回null触发空指针异常问题

问题根因

抛出空指针的直接原因是调用req.getAttribute("sum")返回了null,将null值强转为Integer后赋值给基本类型int时,会自动触发intValue()方法调用,null对象调用方法直接触发空指针。
你换HttpSession传值依然报错的核心原因是:存值的代码从来没有被执行过,不管是request域还是session域,根本就没存入过sum属性,自然取不到值。
代码里的核心错误:

  • Request_Dispatcher_example中只自定义了processRequest方法,没有重写HttpServlet规范要求的doGet/doPost方法。Servlet容器收到请求后只会调用对应请求方式的doXxx方法,你写的参数解析、求和、setAttribute、请求转发逻辑完全不会被触发。
  • 请求转发使用了相对路径s2,如果两个Servlet的映射层级不匹配,就算逻辑执行了也会出现找不到目标资源的问题。
  • 直接访问S2对应的路径,没有先经过Request_Dispatcher_example的处理逻辑,request域里自然不会有提前存入的sum属性。
修复方案

1. 修正Request_Dispatcher_example的方法重写

在类中重写doGet/doPost方法,把业务逻辑和请求转发逻辑放到容器能调用到的方法里,同时转发路径改为绝对路径避免匹配错误:

public class Request_Dispatcher_example extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        String i = req.getParameter("n1");
        String j = req.getParameter("n2");
        
        int nn1= Integer.parseInt(i);
        int nn2 = Integer.parseInt(j);
        int s = nn1 + nn2;
        
        req.setAttribute("sum", s);
        // 路径前加/代表从应用根路径匹配,替换为你S2实际配置的url-pattern
        RequestDispatcher rd = req.getRequestDispatcher("/s2");
        rd.forward(req, res);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        doGet(req, res);
    }
}

2. 优化S2的取值逻辑,增加空值防护

不要直接将getAttribute的结果强转后赋值给基本类型,增加非空判断,避免直接访问S2路径时触发空指针:

public class S2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        // 避免响应乱码
        res.setContentType("text/html;charset=utf-8");
        PrintWriter out = res.getWriter();

        int nn1  = Integer.parseInt(req.getParameter("n1"));
        int nn2  = Integer.parseInt(req.getParameter("n2"));
        int p = nn1*nn2;

        // 先取属性判空再赋值
        Object sumObj = req.getAttribute("sum");
        int sum = 0;
        if (sumObj != null) {
            sum = (Integer) sumObj;
        }

        out.println("Sum : " + sum);
        out.println("Product : " + p);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        doGet(req, res);
    }
}

3. 确认访问路径正确

  • 检查web.xml或注解配置的两个Servlet的url-pattern,确保映射路径和转发路径一致。
  • 访问时必须先请求Request_Dispatcher_example对应的映射地址,带上n1、n2参数,不要直接请求S2的地址,否则永远不会触发存值和转发逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:03:23