268

I'm converting Java to Kotlin with Android Studio. I get double bang after the instance variable. What is the double bang and more importantly where is this documented?

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

3 回答 3

320

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

它与 Kotlin 零安全方法一起记录在此处。

于 2015-12-17T19:20:39.670 回答
113

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

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

于 2017-05-29T18:52:43.393 回答
23

Double-bang 运算符NullPointerException对于(或简称为 NPE)的粉丝来说是一个很好的选择。

空断言运算符 !!将任何值转换为非空类型,如果值为空则抛出异常。

val nonNull = a!!.length

所以你可以写a!!,这将返回一个非空值a(例如这里的a )或者如果为空String则抛出一个NPE 。a

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

于 2019-01-10T21:33:23.873 回答