我正在使用当前最新的 Kotlin 版本 (
1.9.22
),并遇到了我无法解释的行为。
此代码会产生运行时错误(
NullPointerException
):
fun main() {
var name: String? = null
println(name!!.length)
}
虽然此代码会产生编译错误(
Unresolved reference: length
)
fun main() {
var name: String? = "Joe"
name = null
println(name!!.length)
}
为什么简单地对可为空的
name
变量进行重新分配就能让我免于 NullPointerException
的困扰呢?我希望这两个代码片段在功能上是相同的。
我不认为这是编译器规范的外部记录,但这是一个特殊情况。
当您声明并立即初始化变量时,如果您显式标记类型而不是允许推断类型,则编译器会将该值视为未知。由于该值未知,因此它不“知道”它是 null,因此示例代码中不存在编译器错误。
在第二个片段中,
name = null
智能将转换为Nothing?
,这就是为什么.length
无法解析