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

Integer.parseInt无法解析Servlet URL参数中的"id"字符串问题排查

解决更新员工时的NullPointerException问题

我来帮你排查这个空指针问题,核心原因是你的更新流程里ID参数没有正确传递到doPost方法,还有几处细节错误,具体问题和修复步骤如下:


问题分析

  1. ID参数未在请求间传递:
    你的doGet方法获取到员工对象后,没有把它存入request域,导致updateemployee.jsp无法拿到原员工的ID和数据;同时表单也没有携带ID参数,doPost方法自然拿不到ID。
  2. 错误的参数获取方式:
    doPost里用request.getAttribute("id")获取ID是错误的——getAttribute是获取存在request域中的属性,而表单提交的参数需要用request.getParameter()获取,这里拿到的是null,强转int就抛出了NullPointerException。
  3. 注册日期参数缺失:
    表单里没有提交registration_date,但构造Employee时却尝试获取这个参数,这也会导致空指针或格式转换错误。
  4. DeleteServlet的隐藏错误:
    顺便提一句,你的DeleteEmployeeServlet里用request.getAttribute("id")获取ID也是错的,URL参数应该用request.getParameter(),只是暂时没触发问题,建议一起修复。

修复步骤

1. 修改UpdateEmployeeServlet的doGet方法,存入员工对象

在doGet中获取员工后,把它放到request属性里,让JSP能拿到原数据:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    int id = Integer.parseInt(request.getParameter("id"));
    Employee employee = EmployeeDAO.getEmployeeById(id);
    // 将员工对象存入request域,供JSP使用
    request.setAttribute("employee", employee);
    request.getRequestDispatcher("updateemployee.jsp").forward(request, response);
}

2. 完善updateemployee.jsp表单,添加隐藏字段并回显数据

表单添加隐藏的ID字段传递ID,同时回显原姓名和姓氏,保留注册日期(如果需要):

<form action="UpdateEmployeeServlet" method="post">
    <!-- 隐藏字段传递员工ID -->
    <input type="hidden" name="id" value="<%= ((Employee)request.getAttribute("employee")).getId() %>">
    <!-- 回显原姓名 -->
    Name <input type="text" name="name" value="<%= ((Employee)request.getAttribute("employee")).getName() %>"><br>
    <!-- 回显原姓氏 -->
    Surname <input type="text" name="surname" value="<%= ((Employee)request.getAttribute("employee")).getSurname() %>"/><br>
    <!-- 隐藏字段保留原注册日期 -->
    <input type="hidden" name="registration_date" value="<%= ((Employee)request.getAttribute("employee")).getRegistrationDate() %>">
    <input type="submit" value="Save">
</form>

3. 修改UpdateEmployeeServlet的doPost方法,正确处理参数

现在可以通过request.getParameter()获取ID,同时添加异常处理避免崩溃,更新完成后用重定向代替forward(防止表单重复提交):

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        // 从表单参数获取ID并转换
        int id = Integer.parseInt(request.getParameter("id"));
        String name = request.getParameter("name");
        String surname = request.getParameter("surname");
        // 获取原注册日期
        Date registrationDate = Date.valueOf(request.getParameter("registration_date"));
        
        Employee employee = new Employee(id, name, surname, registrationDate);
        EmployeeDAO.updateEmployee(employee);
        
        // 重定向到列表页,避免重复提交
        response.sendRedirect("EmployeeServlet");
    } catch (NumberFormatException e) {
        // 处理ID格式错误
        e.printStackTrace();
        response.sendRedirect("EmployeeServlet?error=invalid_id");
    } catch (IllegalArgumentException e) {
        // 处理日期格式错误
        e.printStackTrace();
        response.sendRedirect("EmployeeServlet?error=invalid_date");
    }
}

4. 修复DeleteEmployeeServlet的doGet方法

把错误的getAttribute改成getParameter:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    int id = Integer.parseInt(request.getParameter("id"));
    EmployeeDAO.deleteEmployee(id);
    response.sendRedirect("EmployeeServlet");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:26:50