окончательное статическое извлечение LocalDateTime из другого класса вызывает java.lang.ExceptionInInitializerError - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть переменная 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 голосов
/ 01 сентября 2018

Мне придется немного угадать, но я думаю, что знаю, в чем твоя проблема. Предположим, у вас есть, например:

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. К счастью, такая ошибка обычно связана с причиной, первоначальным исключением, вызвавшим ее, поэтому причина и место возникновения причины - это интересные сведения для отладки. В вашем случае это было в строке 228 из MyConstants.java, в моем минимальном примере это была строка 13. Так что вот где посмотреть и посмотреть, сможем ли мы понять смысл сообщения

java.lang.IllegalArgumentException: неизвестная буква шаблона: T

...