什么是 Kotlin double-bang (!!) 运算符?

What is the Kotlin double-bang (!!) operator?

我正在使用 Android Studio 将 Java 转换为 Kotlin。我在实例变量之后得到了双重打击。什么是双重爆炸,更重要的是,它在哪里记录?

mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))

这是不安全的可空类型 (T?) 到不可空类型 (T) 的转换, 如果值为 null.

!! 将抛出 NullPointerException

记录了 here 以及 Kotlin 的空安全方法。

这是一个让事情更清楚的例子。 假设你有这个功能

fun main(args: Array<String>) {
    var email: String
    email = null
    println(email)
}

这将产生以下编译错误。

Null can not be a value of a non-null type String

现在您可以通过向 String 类型添加问号使其可为空来防止这种情况发生。

所以我们有

fun main(args: Array<String>) {
    var email: String?
    email = null
    println(email)
}

这会产生

的结果

null

现在如果我们想让函数在email的值为null时抛出异常,我们可以在email的末尾添加两个感叹号。像这样

fun main(args: Array<String>) {
    var email: String?
    email = null
    println(email!!)
}

这将抛出一个 KotlinNullPointerException

Kotlin 的 double-bang 运算符NullPointerException (NPE) 粉丝的绝佳示例。

The not-null assertion operator !! converts any value to a non-null type and throws an exception if the value is null.

val nonNull = str!!.length

如果你写str!!,它将return一个非空值strstr 在这里是 String?)或者如果 str 为空则抛出 NPE。该运算符应该在开发人员保证的情况下使用——该值永远不会为 null。如果你想要一个 NPE,你必须明确地要求它。

!!断言它不为空。可空值后的两个感叹号将其转换为 non-nullable 类型。同时,在转换之前,并没有以任何方式检查该值是否真的不包含null。因此,如果在程序执行过程中发现 !!运算符尝试转换仍然为 null,那么只有一种出路 - 抛出 NullPointerException。