非空断言运算符(!!)奇怪的行为

问题描述 投票:0回答:2

我正在使用当前最新的 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
的困扰呢?我希望这两个代码片段在功能上是相同的。

kotlin compiler-errors nullpointerexception
2个回答
0
投票

我不认为这是编译器规范的外部记录,但这是一个特殊情况。

当您声明并立即初始化变量时,如果您显式标记类型而不是允许推断类型,则编译器会将该值视为未知。由于该值未知,因此它不“知道”它是 null,因此示例代码中不存在编译器错误。


0
投票

在第二个片段中,

name = null
智能将转换为
Nothing?
,这就是为什么
.length
无法解析

© www.soinside.com 2019 - 2024. All rights reserved.