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

使用Java Servlet存储HTML日期值到MySQL时出现NullPointerException

问题分析与解决方案

你遇到的NullPointerException根源在于HTML表单的日期输入框没有name属性,导致Servlet无法通过request.getParameter("datedd")获取到值,date变量为null,调用SimpleDateFormat.parse(null)时就抛出了空指针异常。除此之外,还有几个需要修正的细节,我一步步给你说明:

1. 修复表单输入的name属性问题

HTML表单提交参数是通过name属性识别的,而不是id。你的日期输入框只有id="datedd",缺少name="datedd",所以提交时这个参数根本不会被发送到后端。修改HTML代码:

<input style="color: gray;" type="date" id="datedd" name="datedd" class="form-control">

另外注意:你Servlet里还获取了fueltype和liters参数,但当前HTML代码里没有对应的输入框,这两个参数也会是null,后续插入数据库可能报错,记得补充对应的带name属性的输入控件。

2. 修正日期解析的格式问题

HTML5的type="date"输入框提交的日期格式是ISO标准格式:yyyy-MM-dd,而你代码里用的是SimpleDateFormat("MM/dd/yyyy")来解析,就算拿到了日期值,也会抛出ParseException。

更简单且可靠的方式是直接使用java.sql.Date.valueOf(String)方法,它正好支持yyyy-MM-dd格式的字符串,不需要手动解析:

// 替换原来的日期解析代码
String date = request.getParameter("datedd");
if(date != null) {
    java.sql.Date sqlDate = java.sql.Date.valueOf(date);
    ps.setDate(3, sqlDate);
}

3. 完善代码的资源管理

你的Servlet代码里没有关闭Connection、PreparedStatement等资源,这会导致数据库连接泄漏。建议用try-with-resources语法自动关闭资源:

try {
    Class.forName("com.mysql.jdbc.Driver");
    // 使用try-with-resources自动关闭连接和语句
    try(Connection con = DriverManager.getConnection("jdbc:mysql://localhost/Vehicle", "root", "");
        PreparedStatement ps = con.prepareStatement("INSERT INTO fuel(fueltype,liters,date) VALUES(?,?,?)")) {
        
        String fuelType = request.getParameter("fueltype");
        String liters = request.getParameter("liters");
        String date = request.getParameter("datedd");
        
        ps.setString(1, fuelType);
        ps.setString(2, liters);
        if(date != null) {
            ps.setDate(3, java.sql.Date.valueOf(date));
        } else {
            // 处理日期为空的情况,比如设置默认值或者返回错误提示
            ps.setNull(3, java.sql.Types.DATE);
        }
        
        int i = ps.executeUpdate();
        if (i > 0) {
            System.out.println("Success");
            // 可以在这里给前端返回成功提示,比如重定向到成功页面
            response.sendRedirect("success.jsp");
        } else {
            System.out.println("not success");
            response.sendRedirect("error.jsp");
        }
    }
} catch (ClassNotFoundException | SQLException ex) {
    Logger.getLogger(FillTanks.class.getName()).log(Level.SEVERE, null, ex);
}

4. 额外建议

  • 在前端给表单做基本校验,确保日期输入框不为空后再提交,比如修改showAlert()函数,检查datedd的值是否存在。
  • 检查数据库表fuel的字段是否允许为空,如果date字段是必填的,那必须确保前端提交了有效值,后端也要做非空校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:31:15