Intereting Posts
Запись в базе данных с Android Метод Ссылки на метод суперкласса частный модификатор видимости и подпакеты Весенняя загрузка и спящий режим. Управление сеансом В Kotlin, как я идиоматически обращаюсь к значениям вложенной карты с нулевым значением или возвращать значение по умолчанию? Запустить Java в Kotlin-конвертер из командной строки? Дженерики в Котлине с расширением Задержка с изменением размера дочерних элементов RecyclerView Стереть внутренний статус объекта в тесте Неразрешенная ссылка при ссылке на Java-код из тестов Kotlin в проекте Spring Boot с использованием Gradle Перевести Свифт в Котлин Интервал Рабочего Планировщика называется слишком нерегулярным Класс Kotlin на eclipse действует странно, каждый раз, когда я запускаю программу, я получаю вывод из другого файла Как определить члену делегата с нулевым значением в Котлине? Преобразование императивной функции root в функциональный стиль в kotlin

Kotlin call типы платформы Java приводят к llegalStateException

Я использую kotlin в одном из моих классов Android, и похоже, что IllegalStateException иногда появляется на этой строке, пытаясь получить дополнительную информацию из Bundle .

 keyOrTag = bundle.getString("tag") 

И val объявляется так

 val keyOrTag: String 

К сожалению, у меня нет полной трассировки стека, как я заметил это с консоли GP.

Ладно, я думаю, я знаю, почему это происходит. Проводя это как ответ, чтобы другие, у кого была проблема, могли видеть.

String "tag" добавленный в комплект, может фактически быть null в классе Java, который отправляет его в Kotlin . И поскольку я не объявлял val как nullable, я считаю, что именно поэтому он бросает исключение IllegalStateException (yup, no NPE в kotlin).

Исправление:

 val keyOrTag: String? 

Когда эта ошибка возникает?

IllegalStateException было IllegalStateException Kotlin kotlin.jvm.internal.Intrinsics, возможно, когда вы вызываете типы платформы Java.

Почему вы не смогли увидеть стекTrace of Exception который выбрал kotlin.jvm.internal.Intrinsics из Котлина?

Это связано с тем, что stackTrace удаляется Kotlin в Intinics # sanitizeStackTrace внутри:

 private static <T extends Throwable> T sanitizeStackTrace(T throwable) { return sanitizeStackTrace(throwable, Intrinsics.class.getName()); } 

пример

Вот исходный код платформы StringUtils платформы Java, а метод toNull возвращает значение null если value параметра value null или "" .

 public class StringUtils { public static String toNull(String value) { return value == null || value.isEmpty() ? null : value; } } 

Затем вы пытаетесь присвоить результат вызова метода переменной, не IllegalStateException , возможно, выбрасывает IllegalStateException , например:

 val value: String = StringUtils.toNull("") // ^ //throws IllegalStateException: StringUtils.toNull("") must not be null //try to assign a `null` from `toNull("")` to the non-nullable variable `value` 

Как избежать таких бросков исключения от kotlin.jvm.internal.Intrinsics ?

ЕСЛИ вы не уверены, что возвращаемое значение является null или нет из типов платформы Java, вы должны присвоить значение переменной с null значением / сделать тип возвращаемого значения nullable , например:

 val value: String? = StringUtils.toNull("") // ^--- it works fine