java - 从另一个类检索的最终静态 LocalDateTime 抛出 java.lang.ExceptionInInitializerError

标签 java datetime exception java-time localdate

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

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

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

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的文档:

An ExceptionInInitializerError is thrown to indicate that an exception occurred during evaluation of a static initializer or the initializer for a static variable.

静态变量(和常量)的初始化程序在类加载时执行,这是您第一次使用该类中的某些内容时发生的,在本例中是我们第一次引用MyConstants.MINDATE。幸运的是,此类错误通常与原因(导致该错误的原始异常)相关联,因此原因以及该原因发生的位置是调试时感兴趣的信息。在您的例子中,它位于 MyConstants.java 的第 228 行,在我的最小示例中,它位于第 13 行。因此,我们可以在此处查看并查看我们是否可以理解该消息

java.lang.IllegalArgumentException: Unknown pattern letter: T

关于java - 从另一个类检索的最终静态 LocalDateTime 抛出 java.lang.ExceptionInInitializerError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52126124/

相关文章:

java - 异常(exception)情况。我该如何解决这个问题?第一步

c# - 等待时发生 StaleElementReferenceException

MySQL:无法创建/写入文件 '/tmp/#sql_3c6_0.MYI'(错误代码:2)-这是什么意思?

Java 8 本地日期时间与日期

java - 在Android中比较txt文件和输入字符串

java - 如何持久化大量实体 (JPA)

java - @Document 中的 HashSet,其中实体使用唯一 ID,DuplicatekeyException

java - 在大型 CSV 中查找行的最简单、最快的方法

python - 在 Python 中,如何根据年份、周数和工作日获取日期?

java - 如何处理 API 中以不同格式返回日期时间的 LocalDateTime?