带有安全运算符的Kotlin非空断言
为什么这个代码会给我NPE错误带有安全运算符的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
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代码>抛出。哦,好的,我会修复它,谢谢。