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

我转换Java到Kotlin与Android工作室。我在实例变量后面得到了双bang。什么是双爆炸,更重要的是在哪里有记录?

mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))
135787 次浏览
这是一个不安全的可空类型(T?)到非可空类型(T)的转换, 如果值为null!!将抛出NullPointerException

它被记录在在这里和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的值为空时抛出异常,可以在email的末尾添加两个感叹号。像这样

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

这将抛出KotlinNullPointerException

非空断言运算符

Kotlin的double-bang运营商对于NullPointerException (NPE)的粉丝来说是一个很好的例子。

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

val nonNull = str!!.length

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

!! 是一个断言,它不是空的。可空值后的两个感叹号将其转换为不可空类型。同时,在转换之前,不会以任何方式检查该值是否真的不包含null。因此,如果在程序执行期间发现!!操作符试图转换的值仍然为空,那么将只有一个方法-抛出NullPointerException。

!!(Double Bang)运算符是强制将可为空的变量断言为非空的运算符。

< p >的例子: 这里str是一个带value的字符串。但它是空的。由于它为空,我们需要处理null以避免编译时异常
  val str :String? = "Foo"
val lowerCase = str!!.lowerCase()


    

这里如果加上!!运算符,因为它有非空值,它将工作,小写值将被赋值。

val str :String? = "Foo"
str = null
val lowerCase = str!!.lowerCase()

但在这里,如果你分配空值并使用特定值,它将抛出KotlinNullPointerException

一件重要的事 .在这里是,在大多数情况下,应该避免作为!!操作符,除非它100%确定值是非空值,或者如果异常被捕获并正确处理。

如果你需要避免这个NPE,你可以使用空安全操作符猫王运营商。在kotlin中,使用elvis调用?.操作符是处理空安全的更好方法。 你可以阅读更多关于Kotlin零安全在这里

Java

throws NullPointerException

芬兰湾的科特林

simply use !!

这有助于理解

这在人类语言中意味着:我保证以后会赋值,但现在请不要担心我的变量。另一方面,它在术语上是非空变量。