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()
相同的结果。
由于 Kotlin 有非空断言,我发现了一些有趣的东西...
val myvar: String = null!!
它会崩溃。
但重点是,它不会在编译时进行检查。
应用程序将在运行时崩溃。
它不应该抛出编译时错误吗?
!!
在运行时计算,它只是一个运算符。
表达式(x!!)
- 如果
x == null
, 则抛出 - 否则,它 returns
x
强制转换为相应的不可空类型(例如,它 returns 当调用一个变量时String
输入String?
)。
KotlinNullPointerException
当然,这使得 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()
相同的结果。