Мне придется немного угадать, но я думаю, что знаю, в чем твоя проблема. Предположим, у вас есть, например:
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