使用JDateChooser遇“Date Must not be Null”错误,求排查解决
问题分析与解决
核心问题
- 初始化时
getDate()返回null:刚创建JDateChooser时,默认没有选中任何日期,dateChooser.getDate()会返回null,直接传给SimpleDateFormat.format()就会触发"Date Must not be Null"错误。 - 日期赋值时机错误:你现在是在组件刚初始化的时候就给
Termin设置日期,这时候用户还没来得及选择日期,既拿不到用户输入,也没法随用户选择动态更新。
解决步骤
1. 可选:给日期选择器设置默认日期
如果不想让日期选择器初始为空,可以在创建后直接设置默认日期(比如当前系统日期),避免初始null的情况:
JDateChooser dateChooser = new JDateChooser(); dateChooser.setDate(new Date()); // 设置当前日期为默认值 dateChooser.setBounds(169, 119, 70, 20); kalender.add(dateChooser);
2. 把日期赋值逻辑移到用户操作事件中
要获取用户选择的日期,必须在用户完成选择后再执行赋值操作,比如放在Next按钮的点击事件里:
btnNext3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 在这里获取用户选择的日期并设置给Termin Date selectedDate = dateChooser.getDate(); if(selectedDate != null){ // 非空判断,避免用户清空日期的情况 SimpleDateFormat sdl = new SimpleDateFormat("dd-MM-yyyy"); Termin.setDate(sdl.format(selectedDate)); System.out.println(Termin); } LayeredPane.moveToFront(kontakt); kalender.removeAll(); } });
3. 可选:实时监听日期变化
如果想在用户选择日期的瞬间就更新Termin的date属性,可以给JDateChooser添加属性监听器:
dateChooser.addPropertyChangeListener("date", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { Date selectedDate = (Date) evt.getNewValue(); if(selectedDate != null){ SimpleDateFormat sdl = new SimpleDateFormat("dd-MM-yyyy"); Termin.setDate(sdl.format(selectedDate)); System.out.println("日期已更新:" + Termin); } } });
注意事项
- 永远记得对
dateChooser.getDate()的返回值做非空判断,即使设置了默认日期,用户也可能手动清空选择,导致返回null。 - 不要在组件初始化阶段就尝试获取用户输入,所有依赖用户操作的数据,都要放在对应的事件回调中处理。
内容的提问来源于stack exchange,提问作者Pitergann
相关产品推荐
相关产品推荐

