我是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();
}
但是,只要NPEs
为Activity
,我仍会在Kotlin代码中获得null
。关于我出错的地方的任何想法?
答案 0 :(得分:6)
我想你的NPE不在isAlive()
函数中,而是在引用Activity
之后的某个地方。这可能是.isAlive()
在true
接收方上返回null
这一事实造成的。
那是因为如果接收者是null
,this?.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