Kotlin调用Java平台类型导致llegalStateException
我在我的一个Android类中使用了kotlin
,并且在尝试从Bundle
获取额外信息时,似乎有时会弹出IllegalStateException
kotlin
。
keyOrTag = bundle.getString("tag")
val
是这样宣布的
val keyOrTag: String
不幸的是,我没有完整的堆栈跟踪,因为我从GP控制台注意到了这一点。
好吧,我相信我知道为什么会发生。 把它作为一个答案,以便其他有相关问题的人可以看到。
添加到包中的String "tag"
实际上在将它发送到Kotlin
的Java类中为null
。 而且由于我没有声明val
为空,我相信这就是为什么它抛出一个IllegalStateException(yup,在kotlin没有NPE)。
修正:
val keyOrTag: String?
当这个错误发生?
当您调用Java平台类型时,Kotlin kotlin.jvm.internal.Intrinsics可能会引发IllegalStateException
。
为什么你看不到由Kotlin的kotlin.jvm.internal.Intrinsics引发的
Exception
的stacktrace ?
这是因为在内部的Intrinsics#sanitizeStackTrace方法中,Kotlin删除了stackTrace
:
private static <T extends Throwable> T sanitizeStackTrace(T throwable) { return sanitizeStackTrace(throwable, Intrinsics.class.getName()); }
例
这是一个Java平台类型的StringUtils
源代码,如果参数value
null
或""
, toNull
方法将返回null
。
public class StringUtils { public static String toNull(String value) { return value == null || value.isEmpty() ? null : value; } }
然后,您尝试将方法调用的结果分配给一个不可为空的变量,可能会抛出一个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 ?
如果您不确定Java平台类型的返回值是否为null
,则应将该值指定给一个可为空的变量/使返回类型为空 ,例如:
val value: String? = StringUtils.toNull("") // ^--- it works fine