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

