从另一个类检索的最终静态LocalDateTime引发java.lang.ExceptionInInitializerError

时间:2018-09-01 07:56:26

标签: java datetime exception java-time localdate

我在MINDATE文件中有一个变量MyConstants。您可以在下面看到声明。

public static final LocalDateTime MINDATE =  LocalDateTime.of(LocalDate.of(2011, 1, 1), LocalTime.MIDNIGHT);

我仅通过使用MyConstants.MINDATE就在另一个类中使用了此变量 然后出现以下异常

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.cw.na.vos.DateTest.main(DateTest.java:14)
Caused by: java.lang.IllegalArgumentException: Unknown pattern letter: T
    at java.time.format.DateTimeFormatterBuilder.parsePattern(Unknown Source)
    at java.time.format.DateTimeFormatterBuilder.appendPattern(Unknown Source)
    at java.time.format.DateTimeFormatter.ofPattern(Unknown Source)
    at com.cw.na.vos.MyConstants.<clinit>(MyConstants.java:228)
    ... 1 more

我无法理解其背后的原因。

public class DateTest {

    static final LocalDateTime minD =  LocalDateTime.of(LocalDate.of(2011, 1, 1), LocalTime.MIDNIGHT);
    public static void main(String[] args) {

LocalDateTime ldt = LocalDateTime.of(LocalDate.of(2011, 1, 1), LocalTime.MIDNIGHT);


        System.out.println(minD); // success 
        System.out.println(ldt); //success 
System.out.println(MyConstants.MINDATE); //ExceptionInInitializerError
    }

}

如果我在本地的类中创建相同的变量,则它可以工作,但是当我从不同的类访问类似的LocalDateTime变量时,它将引发异常。

需要帮助。

1 个答案:

答案 0 :(得分:5)

我将不得不猜测一点,但我想我知道您的问题是什么。假设您有例如:

public class MyConstants {

    public static final LocalDateTime MINDATE 
            =  LocalDateTime.of(LocalDate.of(2011, 1, 1), LocalTime.MIDNIGHT);
    public static final DateTimeFormatter FORMATTER 
            = DateTimeFormatter.ofPattern("uuuu-MM-ddTHH:mm");

}

现在,当我喜欢你时:

        System.out.println(MyConstants.MINDATE);

我得到了一个看起来像你的堆栈跟踪异常:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at ovv.so.datetime.format.DateTest.main(DateTest.java:6)
Caused by: java.lang.IllegalArgumentException: Unknown pattern letter: T
    at java.base/java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1800)
    at java.base/java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1697)
    at java.base/java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:564)
    at ovv.so.datetime.format.MyConstants.<clinit>(MyConstants.java:13)
    ... 1 more

如果我猜对了,就像在我上面所做的那样,您在MyConstants的某个地方指定了一个包含T的格式模式。 T格式是ISO 8601日期时间格式的特征。 T是文字,而不是uyM等格式字母,因此当您将其放在格式模式中时,会导致

第一个也是最好的解决方案是,如果您可以避免完全编写自己的格式模式。 ISO 8601格式以DateTimeFormat.ISO_LOCAL_DATE_TIME等内置。寻找以ISO_开头的常量,有一些方法。

第二个最好用格式模式引用T

    public static final DateTimeFormatter FORMATTER 
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm");

现在您的程序运行并打印:

  

2011-01-01T00:00

摘自ExceptionInInitializerError的文档:

  

抛出ExceptionInInitializerError表示   在评估静态初始值设定项或   静态变量的初始化程序。

静态变量(和常量)的初始化程序在加载该类时执行,这是您第一次使用该类中的东西时发生,在这种情况下,这是我们第一次引用MyConstants.MINDATE。幸运的是,此类错误通常与原因,引起该错误的原始异常相关联,因此,该原因以及发生原因的地方是用于调试的有趣信息。在您的情况下,它位于MyConstants.java的第228行中,在我的最小示例中,它位于第13行中。因此,可以在这里查看并查看我们是否可以理解该消息

  

java.lang.IllegalArgumentException:未知模式字母:T