Los types de plataforma de llamada de Kotlin dan como resultado llegalStateException

Estoy usando kotlin en una de mis classs de Android y parece que a veces aparece una IllegalStateException en esta línea cuando intentas get un extra de un Bundle .

 keyOrTag = bundle.getString("tag") 

Y el val es declarado así

 val keyOrTag: String 

Lamentablemente, no tengo el seguimiento de stack completo, ya que me he dado count de esto desde GP Console.

De acuerdo, creo que sé por qué sucede eso. Publicarlo como una respuesta para que otros con un problema relacionado puedan ver.

La String "tag" agregada al package puede ser null en la class Java que la envía a Kotlin . Y como no declare el val como nulo, creo que es por eso que arroja una IllegalStateException (sí, no NPE en kotlin).

La solución:

 val keyOrTag: String? 

Cuando ocurre este error?

IllegalStateException fue lanzada por Kotlin kotlin.jvm.internal.Intrinsics posiblemente al llamar a types de plataforma Java.

¿ Por qué no puedes ver el stack Trace of a Exception lanzado por kotlin.jvm.internal.Intrinsics de Kotlin?

Esto se debe a que stackTrace es eliminado por Kotlin en el método Intrinsics # sanitizeStackTrace internamente:

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

Ejemplo

Aquí hay una plataforma Java tipo código fuente StringUtils , y el método toNull devolverá null si el value del parámetro es null o "" .

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

A continuación , intente asignar el resultado de la llamada al método a una variable que no IllegalStateException , posiblemente arroje una IllegalStateException , por ejemplo:

 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` 

¿Cómo evitar tales lanzamientos de Excepción por kotlin.jvm.internal.Intrinsics ?

Si no está seguro de que el valor devuelto sea null o no desde los types de plataforma Java, debe asignar el valor a una variable que admite null / hacer que el tipo de devolución se pueda anular , por ejemplo:

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