我在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
变量时,它将引发异常。
需要帮助。
答案 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
是文字,而不是u
,y
,M
等格式字母,因此当您将其放在格式模式中时,会导致
第一个也是最好的解决方案是,如果您可以避免完全编写自己的格式模式。 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