带有安全运算符的Kotlin非空断言

带有安全运算符的Kotlin非空断言,kotlin,Kotlin,为什么这个代码会给我NPE错误 fun main() { val myObj: MyObj? = null print(myObj?.someVal!!) } class MyObj{ val someVal = 1 } 非空断言之前是否对整个表达式求值?我认为myObj?应该足以在这里打印空值。是的。使用null安全调用时,如果接收方为null,则表达式的计算结果为null,因此 myObj?.someVal!! 行为与 (if (myObj != null) m

为什么这个代码会给我NPE错误

fun main() {
    val myObj: MyObj? = null
    print(myObj?.someVal!!)
}

class MyObj{
    val someVal = 1
}

非空断言之前是否对整个表达式求值?我认为
myObj?
应该足以在这里打印空值。

是的。使用null安全调用时,如果接收方为null,则表达式的计算结果为null,因此

myObj?.someVal!!
行为与

(if (myObj != null) myObj.someVal else null)!!

(如果
myObj
是一个属性而不是局部变量,则这些属性并不等价,因为智能转换不起作用。)

简单示例

此代码将打印空值:

fun main(){
val myObj:myObj?=null
val-someVal=myObj?.someVal
打印(someVal)
}
当变量为空时,此代码将抛出NPE:

fun main(){
val myObj:myObj?=null
val-someVal=myObj?.someVal
打印(someVal!!)
}

我认为这和做(myObj?.someVal)一样!!所以实际上你是在尝试空值!!如果
myObj
不为空,但
myObj.someVal
为空,则“它与myObj!!.someVal”为False;然后
myObj!!。someVal
为空,并且
myObj?.someVal抛出。哦,好的,我会修复它,谢谢。