返回java代码中的numberformatexception表单SimpleDataFormat

dgtucam1  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(417)

我在常量文件中声明了一个simpleDataFormat对象作为静态字段,如下所示,
常量.java

public static final SimpleDateFormat GENERAL_TZ_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");

在我的类文件中,我的实现是这样的。

String fDate = getTextValue(empNo, "firstDate");
if (null != fDate && !fDate.isEmpty()) {
    try {
        Date date = (Date)(Constants.GENERAL_TZ_FORMATTER).parse(fDate);
        issue.setDate(date.getTime());
    } catch (ParseException e) {
        logUtil.error(LOG, e+ "date : " + date);
    }
}

错误:

Exception while importing data. package name.SecureException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

我的问题是,在某些情况下,这会引发 NumberFormatException (一个非常罕见的情况),所以我一直在想,我做了一个诊断,他们中的大多数人都在解释这种情况可能会发生,因为simpledateformat不是线程安全的。如果是这种情况,我不清楚这段代码如何在不使用多线程的情况下在多线程环境中运行,它会使dateformat.parse()的输入成为空字符串吗?
java的SimpleDataFormat不是线程安全的文章
我试过解决这个问题,但很难重现这个问题,我想知道你对这个问题的看法,这将帮助我找到更好的解决办法。非常感谢你的建议。谢谢您。

vof42yt1

vof42yt11#

好吧,正如你帖子下面的评论已经提到的,你不应该使用 SimpleDateFormat 不管怎样。
你可能偶然发现了这样的情况 SimpleDateFormat 很麻烦。然而,这并不是唯一的原因。这篇文章解释了为什么它如此麻烦。同一篇帖子中提到的原因之一 SimpleDateFormat 不是线程安全的。线程安全是指当多个进程作用于格式化程序时,即利用格式化程序格式化一个日期,并且不会因为干扰而产生不正确、不准确或未定义的结果。
你链接到callicoder的文章很好地解释了原因 SimpleDateFormat 制造麻烦。帖子提到了和你一样的例外:

java.lang.NumberFormatException: For input string: ""

简而言之,线程在使用格式化程序时会产生干扰,因为格式化程序没有同步。这意味着 SimpleDateFormat 类不强制一个线程必须等到其他线程完成对其内部状态的修改。使用的三个类是 SimpleDateFormat , DateFormat 以及 FieldPosition .

这是错误的代码。

使用java.time

您需要转到更新的Java8日期和时间api,可以在 java.time 包裹。它们是绝对线程安全的,因为它们具有不变的特性。在你的情况下,使用 java.time.format.DateTimeFormatter :

public static final DateTimeFormatter GENERAL_TZ_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
ZonedDateTime zdt = ZonedDateTime.parse(fDate, GENERAL_TZ_FORMATTER);
Instant instant = zdt.toInstant();

// Your setDate should really accept an Instant:
issue.setDate(instant);
// If that's REALLY not possible, then you can convert it to an integer
// value equal to the number of milliseconds since 1 January 1970, midnight
//issue.setDate(instant.toEpochMilli());

相关问题