如何判断带有##-##-####日期掩码的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
相关产品推荐
相关产品推荐

