如何从JDateChooser获取日期并格式化,解决空指针异常问题?
如何从JDateChooser获取日期并格式化?
JDateChooser原有示例代码
private void jDateChooser1PropertyChange(java.beans.PropertyChangeEvent evt) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String date = sdf.format(jDateChooser1.getDate()); System.out.println("date:"+ date); }
报错信息
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "java.util.Date.getTime()" because "date" is null at java.base/java.util.Calendar.setTime(Calendar.java:1801) at java.base/java.text.SimpleDateFormat.format(SimpleDateFormat.java:975) at java.base/java.text.SimpleDateFormat.format(SimpleDateFormat.java:968) at java.base/java.text.DateFormat.format(DateFormat.java:375) at com.mycompany.pos.add_stock_adjustment1.jDateChooser1PropertyChange(add_stock_adjustment1.java:880) at com.mycompany.pos.add_stock_adjustment1$7.propertyChange(add_stock_adjustment1.java:466) at java.desktop/java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:341) at java.desktop/java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:333) at java.desktop/java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:266)
错误原因
jDateChooser1.getDate()返回null值时直接传入SimpleDateFormat.format()方法导致空指针。触发null的常见场景包括:组件初始化阶段触发属性变更回调时用户还未选择日期、用户主动清空了日期选择。
修复方案
增加事件类型过滤和日期非空判断即可,修复后代码如下:
private void jDateChooser1PropertyChange(java.beans.PropertyChangeEvent evt) { // 过滤非日期变更的无关事件 if (!"date".equals(evt.getPropertyName())) { return; } Date selectedDate = jDateChooser1.getDate(); // 未选择日期时走兜底逻辑,避免空指针 if (selectedDate == null) { // 可根据业务需求调整此处逻辑,比如给默认日期、提示用户选择等 System.out.println("未选择有效日期"); return; } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String dateStr = sdf.format(selectedDate); System.out.println("date:" + dateStr); }
额外优化建议
如果项目使用JDK 8及以上版本,推荐使用DateTimeFormatter替代SimpleDateFormat,前者是线程安全的实现,避免多线程场景下的时间格式化异常问题。
内容的提问来源于stack exchange,提问作者user15221488
相关产品推荐
相关产品推荐

