从另一个 class 检索的最终静态 LocalDateTime 正在抛出 java.lang.ExceptionInInitializerError
final static LocalDateTime retrieving from another class is throwing java.lang.ExceptionInInitializerError
我在 MyConstants
文件中有一个变量 MINDATE
。你可以看到下面的声明。
public static final LocalDateTime MINDATE = LocalDateTime.of(LocalDate.of(2011, 1, 1), LocalTime.MIDNIGHT);
我只是通过使用 MyConstants.MINDATE
在另一个 class 中使用这个变量
然后我得到以下异常
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
}
}
如果我在本地 class 中创建相同的变量,那么它可以工作,但是当我从不同的 class 访问类似的 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);
我得到一个异常,堆栈跟踪看起来像你的:
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
的文档:
An ExceptionInInitializerError
is thrown to indicate that an
exception occurred during evaluation of a static initializer or the
initializer for a static variable.
静态变量(和常量)的初始值设定项在加载 class 时执行,这发生在您第一次使用 class 中的内容时,在这种情况下我们第一次引用至 MyConstants.MINDATE
。幸运的是,这样的错误通常与原因相关联,即导致它的原始异常,因此原因和原因发生的位置是用于调试的有趣信息。在您的情况下,它位于 MyConstants.java
的第 228 行,在我的最小示例中,它位于第 13 行。所以这是查看我们是否可以理解消息的地方
java.lang.IllegalArgumentException: Unknown pattern letter: T
我在 MyConstants
文件中有一个变量 MINDATE
。你可以看到下面的声明。
public static final LocalDateTime MINDATE = LocalDateTime.of(LocalDate.of(2011, 1, 1), LocalTime.MIDNIGHT);
我只是通过使用 MyConstants.MINDATE
在另一个 class 中使用这个变量
然后我得到以下异常
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
}
}
如果我在本地 class 中创建相同的变量,那么它可以工作,但是当我从不同的 class 访问类似的 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);
我得到一个异常,堆栈跟踪看起来像你的:
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
的文档:
An
ExceptionInInitializerError
is thrown to indicate that an exception occurred during evaluation of a static initializer or the initializer for a static variable.
静态变量(和常量)的初始值设定项在加载 class 时执行,这发生在您第一次使用 class 中的内容时,在这种情况下我们第一次引用至 MyConstants.MINDATE
。幸运的是,这样的错误通常与原因相关联,即导致它的原始异常,因此原因和原因发生的位置是用于调试的有趣信息。在您的情况下,它位于 MyConstants.java
的第 228 行,在我的最小示例中,它位于第 13 行。所以这是查看我们是否可以理解消息的地方
java.lang.IllegalArgumentException: Unknown pattern letter: T