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

时间:2016-10-19 15:04:23

标签: java android kotlin kotlin-android-extensions kotlin-null-safety

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

但是,只要NPEsActivity,我仍会在Kotlin代码中获得null。关于我出错的地方的任何想法?

3 个答案:

答案 0 :(得分:6)

我想你的NPE不在isAlive()函数中,而是在引用Activity之后的某个地方。这可能是.isAlive()true接收方上返回null这一事实造成的。

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

尝试以任一方式更改您的功能,以便它在false接收器上返回null,例如:

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

答案 1 :(得分:0)

我建议写

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

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

答案 2 :(得分:0)

虽然可接受的答案效果很好,但我建议改用相等检查,因为这会导致可读性更高的代码:

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