Kotlin中的非空断言和null值。

6
由于 Kotlin 具有非空断言,我发现了一些有趣的事情...
val myvar: String = null!!

它会崩溃。

但重点是,它不会在编译时检查。

应用程序将在运行时崩溃。

难道它不应该抛出编译时错误吗?


FYI:IntelliJ IDEA会标记val myvar: String =并显示警告:“无法访问的代码”。 - mfulton26
1个回答

11

!! 在运行时进行求值,它只是一个操作符。

表达式 (x!!)

  • 如果 x == null,则抛出 KotlinNullPointerException 异常,
  • 否则,将其转换为相应的非空类型并返回(例如,在类型为 String? 的变量上调用时,将其作为 String 返回)。

当然,这使得 null!! 成为 throw KotlinNullPointerException() 的简写。


如果有帮助的话,可以将 !! 视为执行以下函数:

fun <T> T?.toNonNullable() : T {
    if(this == null) {
        throw KotlinNullPointerException()
    }
    return this as T // this would actually get smart cast, but this 
                     // explicit cast demonstrates the point better
}

因此,执行x!!将给您与x.toNonNullable()相同的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接