我在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变量时,它将引发异常。

需要帮忙。

最佳答案

我将稍作猜测,但我想我知道您的问题是什么。假设您有例如:

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);


我收到了一个看起来像您的stacktrace的异常:

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

09-10 20:08