Kotlin 对 null 的非空断言

Kotlin non-null assertion on null

由于 Kotlin 有非空断言,我发现了一些有趣的东西...

val myvar: String = null!!

它会崩溃。

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

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

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

!! 在运行时计算,它只是一个运算符。

表达式(x!!)

  • 如果 x == null,
  • 则抛出 KotlinNullPointerException
  • 否则,它 returns x 强制转换为相应的不可空类型(例如,它 returns 当调用一个变量时 String输入 String?)。

当然,这使得 null!! shorthand 为 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() 相同的结果。