如何在 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();
}
但是,每当 Activity
为 null
时,我仍然会在 Kotlin 代码中得到 NPEs
。想知道我哪里出错了吗?
我想你得到的 NPE 不是在 isAlive()
函数中而是在之后的某个地方,当 Activity
被引用时。这可能是由于 .isAlive()
returns true
在 null
接收器上造成的。
这是因为如果接收者是null
,this?.isFinishing ?: false
选择了正确的分支false
,因此!(this?.isFinishing ?: false)
是true
。
尝试以任一方式更改您的函数,以便它 returns false
在 null
接收器上,例如:
fun Activity?.isAlive(): Boolean = !(this?.isFinishing ?: true)
我建议写作
fun Activity?.isAlive(): Boolean = this != null && !this.isFinishing
我发现单独的 null 检查和条件比组合版本更容易阅读。
虽然接受的答案工作正常,但我建议改用相等性检查,因为它会产生更具可读性的代码:
fun Activity?.isAlive(): Boolean = this?.isFinishing == false
我是 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();
}
但是,每当 Activity
为 null
时,我仍然会在 Kotlin 代码中得到 NPEs
。想知道我哪里出错了吗?
我想你得到的 NPE 不是在 isAlive()
函数中而是在之后的某个地方,当 Activity
被引用时。这可能是由于 .isAlive()
returns true
在 null
接收器上造成的。
这是因为如果接收者是null
,this?.isFinishing ?: false
选择了正确的分支false
,因此!(this?.isFinishing ?: false)
是true
。
尝试以任一方式更改您的函数,以便它 returns false
在 null
接收器上,例如:
fun Activity?.isAlive(): Boolean = !(this?.isFinishing ?: true)
我建议写作
fun Activity?.isAlive(): Boolean = this != null && !this.isFinishing
我发现单独的 null 检查和条件比组合版本更容易阅读。
虽然接受的答案工作正常,但我建议改用相等性检查,因为它会产生更具可读性的代码:
fun Activity?.isAlive(): Boolean = this?.isFinishing == false