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

如何判断带有##-##-####日期掩码的jFormattedTextField是否为空

问题根因

  • 空校验失效:带##-##-####掩码的JFormattedTextField未收到有效输入时,getText()返回的是包含占位符(默认是空格)的格式化字符串(如" - - "),永远不会匹配空串"",原有校验逻辑直接被跳过。
  • 空指针报错:校验跳过后,无效的日期字符串触发ParseException,utilDate保持初始null值,后续直接调用utilDate.getTime()就触发空指针异常。

修复方案

1. 修正空校验逻辑

推荐优先使用getValue()判断,JFormattedTextField无有效输入时该方法会返回null,判断更准确,校验通过后必须加return中断后续逻辑执行:

else if (jFormattedTextFieldDATA.getValue() == null)
{
    JOptionPane.showMessageDialog(null,"请补充日期字段");
    try {
        conecta.conn.setAutoCommit(false);
        conecta.conn.rollback();
    } catch (SQLException ex) {
        Logger.getLogger(Pessoa.class.getName()).log(Level.SEVERE, null, ex);
    }
    // 必须加return中断后续代码,否则校验后仍会执行数据库操作逻辑
    return;
}

如果要继续使用getText()做判断,需要先清理占位符:

else if (jFormattedTextFieldDATA.getText().trim().replaceAll("-|\\s", "").isEmpty())
{
    // 同上的提示、回滚、return逻辑
}

2. 修正日期解析逻辑

关闭SimpleDateFormat的宽松解析避免无效日期被误识别,同时增加异常后的中断逻辑和空值兜底判断:

SimpleDateFormat formatter  = new SimpleDateFormat ("dd-MM-yyyy");
// 关闭宽松解析,只有严格符合dd-MM-yyyy格式的有效日期才会解析成功
formatter.setLenient(false);
java.util.Date utilDate = null;
try {
    utilDate = formatter.parse(jFormattedTextFieldDATA.getText());
} catch (ParseException ex) {
   Logger.getLogger(Pessoa.class.getName()).log(Level.SEVERE, null, ex);
   JOptionPane.showMessageDialog(null,"日期格式无效,请输入正确的dd-MM-yyyy格式日期");
   // 解析失败直接中断
   return;
}
// 空值兜底判断
if (utilDate == null) {
    JOptionPane.showMessageDialog(null,"日期无效,请重新输入");
    return;
}
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
pst.setDate(5, sqlDate);
pst.executeUpdate();

内容的提问来源于stack exchange,提问作者Luís Felipe Ambrozin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:45:03