如何在 Android Activity 上使用 Kotlin 扩展函数正确执行空值检查

How to properly do null checks using Kotlin extension functions on an Android Activity

我是 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();
}

但是,每当 Activitynull 时,我仍然会在 Kotlin 代码中得到 NPEs。想知道我哪里出错了吗?

我想你得到的 NPE 不是在 isAlive() 函数中而是在之后的某个地方,当 Activity 被引用时。这可能是由于 .isAlive() returns truenull 接收器上造成的。

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

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

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

我建议写作

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

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

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

fun Activity?.isAlive(): Boolean = this?.isFinishing == false