在Java中解析日期时的异常

Lar*_*rry 3 java

按照评论编辑

出于某种原因,当我尝试在Java中解析和格式化时,我似乎正在随机发生此异常.DateString

这是我得到的代码片段(这仅用于测试目的):

SimpleDateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
for(...){
  ...
   System.out.println("Before parsing: [" + lastEntryDate + "]");
   Date date = formatter.parse(lastEntryDate);
   System.out.println("After parsing: [" + date + "]”);
}
Run Code Online (Sandbox Code Playgroud)

并输出:

Before parsing: [Sun Aug 07 22:45:30 EST 2011]
After parsing: [Sun Aug 07 22:45:30 EST 2011]
Before parsing: [Sun Aug 07 22:45:31 EST 2011]
After parsing: [Sun Aug 07 22:45:31 EST 2011]
Before parsing: [Sun Aug 07 22:45:31 EST 2011]
After parsing: [Sun Aug 07 22:45:31 EST 2011]
Before parsing: [Sun Aug 07 22:45:31 EST 2011]
After parsing: [Sun Aug 07 22:45:31 EST 2011]
Before parsing: [Sun Aug 07 22:45:31 EST 2011]
After parsing: [Sun Aug 07 22:45:31 EST 2011]
Before parsing: [Sun Aug 07 22:45:31 EST 2011]
java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Long.parseLong(Long.java:431)
    at java.lang.Long.parseLong(Long.java:468)
    at java.text.DigitList.getLong(DigitList.java:177)
    at java.text.DecimalFormat.parse(DecimalFormat.java:1298)
    at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1936)
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1312)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at proj01.servicebus.ServiceBus.writeFeedEntry(ServiceBus.java:211)
    at proj01.servicebus.ServiceBus.writeFeedEntries(ServiceBus.java:243)
    at proj01.servicebus.ServiceBus.access$1(ServiceBus.java:241)
    at proj01.servicebus.ServiceBus$1.call(ServiceBus.java:84)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)
Run Code Online (Sandbox Code Playgroud)

问题是:

  • 有时,解析失败了?!(例如,见00:00:00)
  • 有时,显示的异常被抛出?!
  • 问题似乎是随机的!

这个问题的可能原因和解决方案是什么?

Jon*_*eet 8

看起来你正试图解析一个空字符串.因此错误在输入数据中 - 遗憾的是,在这种情况下,您将不会显示错误数据,因为您解析只调用System.out.println一次.

如果将诊断更改为:

System.out.println("Before parsing: [" + lastEntryDate + "]");
Date date = formatter.parse(lastEntryDate);
System.out.println("After parsing: [" + date + "]");
Run Code Online (Sandbox Code Playgroud)

我怀疑当数据丢失或完全无效时,您会看到异常; 它解析为"Sun Aug 07 00:00:00 EST 2011"我怀疑你会发现输入数据真的有这些信息.

编辑:如果你使用多个线程,你应该SimpleDateFormat在线程之间共享.在每个线程中创建一个或者(我的偏好)改为使用Joda Time - 它通常是一个更好的库,并且它的格式化程序线程安全的.


Ste*_*n C 6

对于相同输入"随机"发生的故障强烈暗示了线程问题.stacktrace告诉我你很可能在这个测试中使用多个线程.

我怀疑问题是你SimpleDateFormat在多个线程之间共享一个对象而没有正确地同步它的使用.在javadoc中SimpleDateFormat这样说:

"日期格式不同步.建议为每个线程创建单独的格式实例.如果多个线程同时访问格式,则必须在外部同步." .