Java传入字符串日期后调用getData()返回null问题排查
问题原因
你拿到的日期始终为null,核心是两个问题叠加导致的:
- 日期格式化模式和实际输入的字符串格式不匹配,解析直接失败
- 异常捕获块是空的,解析报错被完全吞掉,
data字段从未被成功赋值,保持了成员变量的默认值null
具体错误细节:
- 你定义的
SimpleDateFormat模式为"HH/dd/MM/yyyy",这个模式要求输入字符串必须用3个斜杠分隔为4段,依次对应「小时/日/月/年」,比如15/18/09/2019才符合格式要求。但你注释里的示例值"18/09/2019"只有2个斜杠、分3段,和模式要求的格式完全不匹配,调用parse方法时会直接抛出ParseException。 - setter方法里的catch块没有任何处理逻辑,解析失败后既不打印错误也不抛出异常,程序会静默跳过赋值逻辑,
data一直是默认的null值。 - 额外隐患:
SimpleDateFormat是线程不安全的类,定义为类成员变量在多线程场景下会出现解析结果错乱的问题。
修复方法
- 先对齐格式化模式和你实际需要的输入格式:
- 如果你不需要输入小时,只需要输入「日/月/年」格式的日期(比如示例里的
18/09/2019),把格式化器的模式修改为对应格式即可:
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");- 如果你确实需要带小时的「小时/日/月/年」格式,那输入时必须传3个斜杠分隔的4段内容,和模式要求匹配。
- 如果你不需要输入小时,只需要输入「日/月/年」格式的日期(比如示例里的
- 禁止写空的异常捕获块,至少打印错误信息方便排查问题:
public void setData(String dataRecebida) { try { this.data = formatter.parse(dataRecebida); } catch(Exception e) { // 打印解析错误栈,方便定位格式问题 e.printStackTrace(); } }
修正后输入符合格式要求的日期字符串,就能正常解析拿到Date对象,不会再返回null。
内容的提问来源于stack exchange,提问作者matheusprovin
相关产品推荐
相关产品推荐

