什么是Kotlin双爆炸(!!)操作员?

时间:2015-12-17 19:10:20

标签: kotlin kotlin-null-safety

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

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

3 个答案:

答案 0 :(得分:137)

这是不安全的可空类型(T?)转换为非可空类型(T)。 如果值为NullPointerException,它将抛出null

记录here以及Kotlin无效安全手段。

答案 1 :(得分:54)

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

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时抛出异常,我们可以在电子邮件末尾添加两个惊叹号。喜欢这个

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

这将抛出KotlinNullPointerException

答案 2 :(得分:0)

这对于NullPointerException(或简称NPE)爱好者来说是一个不错的选择:非空断言运算符 !! 可以转换任何内容值为非空类型,如果该值为null,则抛出异常。

val lll = a!!.length

因此您可以编写 a!! ,这将返回非空值 a (此处为String例如),如果 a 为空,则抛出NPE。

如果需要NPE,可以使用它,但是必须明确要求它。 在开发人员保证的情况下应使用此运算符-值永远不会为空

希望这会有所帮助。