Kotlin中相似代码使用安全调用运算符出现不同结果的疑问
Kotlin两段可空代码执行差异的原因
首先要明确:正常情况下,你给出的两段代码都应该编译通过,运行后输出null。如果你的第一段代码真的出现了编译错误,大概率是以下几种情况导致的:
- IDE临时误判:像IntelliJ IDEA这类IDE的代码分析偶尔会抽风,尤其是刚修改完代码时。试试刷新项目、重启IDE,或者执行
Build -> Rebuild Project重新编译,这种假报错通常会消失。 - Kotlin版本过旧:如果你用的是很早的Kotlin版本(比如1.0.x之前),当时对安全调用运算符
?.的支持还不完善。升级到最新稳定版就能解决。 - 代码书写失误:可能你实际写代码时,不小心把安全调用
?.写成了普通的.——因为name是可空类型String?,直接调用非空方法toLowerCase()会触发编译错误,提示“非法访问可空类型的成员”,这和你描述的报错一致。
再说说两段代码的正确逻辑:
不管是先给name赋值字符串再改成null,还是直接赋值null,name的类型始终是String?(可空字符串类型)。Kotlin的安全调用?.规则很简单:如果变量不为null,就执行后面的方法;如果是null,就直接返回null,不会触发空指针异常。所以两段代码的正确运行结果都是输出null。
内容的提问来源于stack exchange,提问作者Rajat Bansal
相关产品推荐
相关产品推荐

