当已经检查了可空性时,Kotlin空检查(!!)

时间:2019-07-09 15:54:14

标签: android kotlin

我有一个关于Kotlin及其null检查警告的问题。

假设我创建了一个名为“用户”的对象,该对象具有一些属性,例如名称,姓氏等。以下代码是示例:

if(user != null) {
    val name = user!!.name
    val surname = user.surname
    val phoneNumber = user.phoneNumber
} else 
    // Something else

为什么,即使我检查用户不为空,Kotlin仍要我使用!!我第一次打电话给用户?此时不能为空。

我知道我可以使用以下代码段,但我不了解这种行为。

user?.let{
    // Block when user is not null
}?:run{
    // Block when user is null
}

1 个答案:

答案 0 :(得分:4)

有这种行为的原因。基本上是因为编译器无法确保user检查后if的值不会为空。

此行为仅适用于var user,不适用于val user。例如,

val user: User? = null;
if (user != null) {
  // user not null
  val name = user.name // won't show any errors
}
var user: User? = null;
if (user != null) {
  // user might be null
  // Since the value can be changed at any point inside the if block (or from another thread).
  val name = user.name // will show an error
}

let甚至可以确保var变量的不变性。 let创建一个与原始变量不同的新最终值。

var user: User? = null
user?.let {
  //it == final non null user
  //If you try to access 'user' directly here, it will show error message,
  //since only 'it' is assured to be non null, 'user' is still volatile.
  val name = it.name // won't show any errors
  val surname = user.surname // will show an error
}