我转换Java到Kotlin与Android工作室。我在实例变量后面得到了双bang。什么是双爆炸,更重要的是在哪里有记录?
mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))
我转换Java到Kotlin与Android工作室。我在实例变量后面得到了双bang。什么是双爆炸,更重要的是在哪里有记录?
mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))
当前回答
!! 是一个断言,它不是空的。可空值后的两个感叹号将其转换为不可空类型。同时,在转换之前,不会以任何方式检查该值是否真的不包含null。因此,如果在程序执行期间发现!!操作符试图转换的值仍然为空,那么将只有一个方法-抛出NullPointerException。
其他回答
非空断言运算符
Kotlin的双bang运算符对于NullPointerException (NPE)的爱好者来说是一个很好的示例。
非空断言运算符!!将任何值转换为非空类型,如果值为空则抛出异常。
val nonNull = str!!.length
如果你写str!!,它将返回一个非空值的str (str是一个字符串?如果str为空,则抛出NPE。这个运算符应该在开发人员保证-值永远不会为空的情况下使用。如果你想要一个NPE,你必须明确地提出要求。
这在人类语言中意味着:我保证以后会赋值,但现在请不要担心我的变量。另一方面,它在术语上是非空变量。
!! 是一个断言,它不是空的。可空值后的两个感叹号将其转换为不可空类型。同时,在转换之前,不会以任何方式检查该值是否真的不包含null。因此,如果在程序执行期间发现!!操作符试图转换的值仍然为空,那么将只有一个方法-抛出NullPointerException。
Java
throws NullPointerException
科特林
simply use !!
这有助于理解
这里有一个例子让事情更清楚。 假设你有这个函数
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