You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:18:28