JSP购物篮开发遭遇java.lang.NumberFormatException: null错误求助
我来帮你拆解这个典型的参数缺失导致的类型转换异常,一步步解决你的购物篮开发问题。
首先,先明确你的报错核心信息:
消息:处理JSP页面/carritobolsos.jsp第23行时发生异常
描述:服务器遇到内部错误,无法完成请求
异常栈:
org.apache.jasper.JasperException: 处理JSP页面/carritobolsos.jsp第23行时发生异常
20: <%
21: DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
22: Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:XE","system", "javaoracle");
23: int codigo=Integer.parseInt(request.getParameter("cod"));
...
根本原因:
java.lang.NumberFormatException: null
java.lang.Integer.parseInt(Integer.java:542)
...
这个异常的本质是**request.getParameter("cod")返回了null**,而Integer.parseInt()方法无法将null转换为整数,直接触发了NumberFormatException。
问题排查与解决方案
1. 先确认请求参数是否正确传递
- 检查发起请求的商品页面:
- 如果是表单提交,确保表单里有一个
name="cod"的input元素(比如隐藏域),并且在提交时已经正确填充了商品ID值。 - 如果是通过"加入购物车"链接跳转,确保URL里包含
?cod=商品ID参数,比如:<a href="carritobolsos.jsp?cod=1001">加入购物车</a>。
- 如果是表单提交,确保表单里有一个
- 可以通过浏览器开发者工具的Network面板,查看请求的参数列表,确认
cod参数是否确实被传递到了后台。
2. 在代码中增加参数校验(最直接的修复)
在转换整数之前,先判断参数是否存在且不为空,避免直接转换null导致异常:
<% // 先获取参数并做非空校验 String codParam = request.getParameter("cod"); int codigo; if (codParam != null && !codParam.trim().isEmpty()) { try { codigo = Integer.parseInt(codParam); } catch (NumberFormatException e) { // 处理参数不是有效整数的情况 out.println("无效的商品ID,请返回重新选择"); return; // 终止后续代码执行,避免无效的数据库操作 } } else { // 参数缺失,跳回商品列表页或者提示用户选择商品 response.sendRedirect("你的商品列表页面.jsp"); return; } // 后续的JDBC逻辑放在这里执行 DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:XE","system", "javaoracle"); Statement pstm=conn.createStatement(); // ... 你的其他业务代码 %>
3. 额外的代码优化建议(提升健壮性)
- 不要在JSP中直接写JDBC逻辑:建议把数据库操作放到Servlet或者专门的DAO(数据访问对象)类中,JSP只负责页面渲染,这样代码更易维护和调试。
- 使用PreparedStatement防止SQL注入:如果后续要根据
codigo查询商品,不要用Statement拼接SQL,改用PreparedStatement更安全:String sql = "SELECT cod_producto, nombre_producto, detalles, precio, imagen FROM ARTICULOS WHERE cod_producto = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, codigo); ResultSet rs = pstmt.executeQuery(); - 正确管理数据库连接:用try-with-resources自动关闭连接、Statement、ResultSet,避免连接泄漏:
<% try (Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","system", "javaoracle"); PreparedStatement pstmt = conn.prepareStatement(sql)) { // 执行数据库操作 } catch (SQLException e) { e.printStackTrace(); } %> - 优化Driver注册方式:用
Class.forName("oracle.jdbc.OracleDriver")代替直接new,避免重复注册Driver实例:Class.forName("oracle.jdbc.OracleDriver");
内容的提问来源于stack exchange,提问作者Ioan Tautean

