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