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

JSP购物篮开发遭遇java.lang.NumberFormatException: null错误求助

解决JSP购物篮开发中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:41:09