3

我是 Kotlin 的新手,并试图将我们现有代码库中的众多 Android Util 方法之一转换为 Kotlin 扩展函数。

这是 Kotlin 代码:

fun Activity?.isAlive(): Boolean {
    return !(this?.isFinishing ?: false)
}

这意味着相当于这个Java方法:

public static boolean isAlive(Activity activity) {
    return activity != null && !activity.isFinishing();
}

但是,只要is ,我仍然NPEs会输入 Kotlin 代码。关于我要去哪里错的任何想法?Activitynull

4

3 回答 3

7

我想你不是在isAlive()函数中得到 NPE,而是在之后的某个地方,当Activity被引用时。.isAlive()这可能是由于接收器返回true的事实引起的null

那是因为如果接收者是null,则this?.isFinishing ?: false选择正确的分支false,因此!(this?.isFinishing ?: false)true

尝试以任何一种方式更改您的函数,以便它falsenull接收器上返回,例如:

fun Activity?.isAlive(): Boolean = !(this?.isFinishing ?: true)
于 2016-10-19T15:23:35.543 回答
0

我建议写

fun Activity?.isAlive(): Boolean = this != null && !this.isFinishing 

我发现单独的空值检查和条件比组合版本更容易阅读。

于 2016-10-20T08:21:27.427 回答
0

虽然接受的答案很好,但我建议改用相等性检查,因为它会产生更具可读性的代码:

fun Activity?.isAlive(): Boolean = this?.isFinishing == false
于 2018-08-23T08:05:12.150 回答