Как предотвратить сбой из-за java.util.Date.toString?

Иногда следующий код вызывает сбой приложения Android:

try {
    (new Date()).toString());
} catch (Exception ex) {
    ...
}

Трассировки стека:

java.lang.AssertionError: 
  at android.icu.impl.TimeZoneNamesImpl$ZNames.getNameTypeIndex (TimeZoneNamesImpl.java:724)
  at android.icu.impl.TimeZoneNamesImpl$ZNames.getName (TimeZoneNamesImpl.java:790)
  at android.icu.impl.TimeZoneNamesImpl.getTimeZoneDisplayName (TimeZoneNamesImpl.java:183)
  at android.icu.text.TimeZoneNames.getDisplayName (TimeZoneNames.java:261)
  at java.util.TimeZone.getDisplayName (TimeZone.java:405)
  at java.util.Date.toString (Date.java:1066)

Судя по всему, ошибку не отловить. Есть ли способ предотвратить это?

Можете ли вы указать, на какую версию Android вы нацеливаетесь?

crgarridos 14.08.2018 17:47

Для отладки вы можете попробовать сохранить new Date() в переменной и получить доступ к различным полям.

Ellen Spertus 14.08.2018 17:48
AssertionError расширяет Error, а не Exception. Вы можете поймать это, если явно поймаете AssertionError
greg-449 14.08.2018 18:01

связанные github.com/google/volley/issues/177

xingbin 14.08.2018 18:09

@crgarridos targetSdkVersion 27

Hong 14.08.2018 19:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
5
672
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Очень странная проблема ...

Кстати, это не исключение, а AssertionError, который расширяется от Error.

Вы можете поймать это, используя:

try {
    (new Date()).toString());
} catch (AssertionError ex) {// or Error or Throwable
    ...
}

Если вы получаете AssertionError с использованием новая дата (), что кажется странным и, возможно, связано с проблемой Android 8, а не с вашим кодом, вы можете использовать java.time из Java 8 вместо java.util.Date следующим образом:

import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("yyyy/MM/dd HH:mm:ss")
    .withZone(ZoneId.systemDefault()); //you must add time zone because of Instant

Instant currentTimestamp = Instant.now();

System.out.print(formatter.format(currentTimestamp));          

Большое спасибо за ваш ответ. Да, это происходит только с устройствами Android 8.1. Я предполагаю, что ваш ответ сработает, но, к сожалению, я не могу принять два ответа.

Hong 14.08.2018 19:17

@Hong Я верю, что вы можете изменить свое согласие, если захотите.

Ellen Spertus 14.08.2018 20:39

Я знаю, что могу изменить ответ, но не могу принять два ответа одновременно, если правильно понимаю. Я предполагаю, что первый ответ также помогает предотвратить сбой.

Hong 14.08.2018 22:38

Правильное направление в этом ответе с использованием java.time, но LocalDateTime - это как раз тот класс, который здесь не подходит. Отсутствие какой-либо концепции часового пояса или смещения от UTC, LocalDateTime представляет ли нет момент. Вместо этого используйте Instant для UTC или ZonedDateTime для определенного часового пояса.

Basil Bourque 15.08.2018 17:56

@Basil Bourque хорошо, круто, спасибо за заметку! Я предполагаю, что вы проголосовали против, и это нормально, хотя я бы улучшил свой ответ только из вашего комментария, но я обновил свой пост, используя Мгновенное, поэтому я не уверен, почему голосование против остается, если оно был ты. В любом случае, каждый предоставленный мной фрагмент предлагает рабочее альтернативное решение исходной проблемы OP.

ViaTech 16.08.2018 14:18

@ViaTech Мое отрицательное голосование остается, потому что в этом Ответе по-прежнему рекомендуется неправильный класс. Не верьте мне на слово. Просто прочтите документация класса: не может представлять мгновение на временной шкале. Я бы также проголосовал против ответа, в котором каким-то образом удалось суммировать ( 2 + 2 ) с использованием строк или битового массива, а не с использованием int, Integer или BigInteger. Очевидно верный результат не оправдывает ненадлежащее злоупотребление неправильными классами.

Basil Bourque 16.08.2018 18:05

@Basil Bourque: Хорошо, твердая ссылка. Я удалил свои примеры, в которых используется LocalDateTime. Однако технически на основе вопроса OPs нет обозначения даты, и в представленной вами документации говорится, что это приемлемо для дней рождения, кто знает, может быть, это помогло бы кому-то.

ViaTech 16.08.2018 18:23

Другие вопросы по теме