DateFormat报NumberFormatException

这几天在开发一个接口的时候,内部调用了一个别人查询数据的接口,发到正式环境测试的时候一直报错,如下图所示:
图1
从图中可以看出是代码中122行除了问题,代码中122行是这样的:
在这里插入图片描述
所以很自然的想到了是日期格式转换错误,加上日志把temp输出了一下:在这里插入图片描述
格式基本都正确,并没有我想象当中的空字符串。
这时候突然注意到一个问题
我的报错是NumberFormatException而不是ParseFormatException,如果按我的猜测,输入空字符串导致格式转换,那么应该是ParseFormatException,如下图所示:在这里插入图片描述
所以问题应该不是格式的问题,百度了一下,才知道原来是多线程的问题,SimpleDateFormat是不安全的,如果在同一时间有多个线程使用他,那么极有可能造成该问题,这种场景很符合我的业务,于是我在代码中为其单独定义一个SimpleDateFormat后在测试,果然解决了该问题。

那么问题来了,SimpleDateFormat为什么不安全呢?
我们看下源码,可以看到SimpleDateFormat的parse方法调自父类DateFormat的parse方法,而DateFormat的parse方法调用了parse抽象方法,该抽象方法被SimpleDateFormat实现
在这里插入图片描述
接下来我和我查询的资料有些分歧,我查阅到的资料认为这个多线程问题是因为源码中这一段代码:在这里插入图片描述
establish(calendar)方法中会有一个calendar.clear操作,如果两个线程A、B同时进入该方法,A方法在执行完之后,将calendar清除了,那么B线程此时拿到的calendar就是为空,就出现了多线程问题;

但是我觉得并不是这里的问题,首先根据图1的报错信息,我们可以注意到栈跟踪并没有跟踪到这一块儿,而是跟踪到了SimpleDateFormat.parse方法中的第1869行的subParse方法;其次,Calendar.clear方法根据官方文档,只是将Calendar设置为1970年,并不会导致报错。
在这里插入图片描述

但是,我把这边的源码看了一遍,并没有发现这个地方会出现问题。。。就很没有说服力。

这篇文章主要就是为了说明DateFormat的线程不安全问题,但是为何是不安全,目前来说,这两个观点都无法说服我自己,希望有大佬看了之后能指正一下。

参考资料:SimpleDateFormat的线程安全问题 及NumberFormatException异常

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值