我转换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"))
当前回答
!!(Double Bang)运算符是强制将可为空的变量断言为非空的运算符。
例子: 这里str是一个带value的字符串。但它是空的。由于它可为空,我们需要处理null以避免编译时异常。
val str :String? = "Foo"
val lowerCase = str!!.lowerCase()
这里如果加上!!运算符,因为它有非空值,它将工作,小写值将被赋值。
val str :String? = "Foo"
str = null
val lowerCase = str!!.lowerCase()
但在这里,如果您分配空值并使用特定值,它将抛出KotlinNullPointerException。
这里有一个重要的事情是,在大多数情况下应该避免使用as !!运算符,除非它100%确定值是非空值,或者异常被捕获并正确处理。
如果你需要避免这种NPE,你可以在elvis操作符中使用空安全操作符。空安全调用?在kotlin中,使用elvis的运算符是处理零安全的更好方法。 你可以在这里阅读更多关于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
这是不安全的可空类型(T?)到非可空类型(T)的转换, !! 如果值为空,将抛出NullPointerException。
这里还介绍了Kotlin零安全方法。
!!(Double Bang)运算符是强制将可为空的变量断言为非空的运算符。
例子: 这里str是一个带value的字符串。但它是空的。由于它可为空,我们需要处理null以避免编译时异常。
val str :String? = "Foo"
val lowerCase = str!!.lowerCase()
这里如果加上!!运算符,因为它有非空值,它将工作,小写值将被赋值。
val str :String? = "Foo"
str = null
val lowerCase = str!!.lowerCase()
但在这里,如果您分配空值并使用特定值,它将抛出KotlinNullPointerException。
这里有一个重要的事情是,在大多数情况下应该避免使用as !!运算符,除非它100%确定值是非空值,或者异常被捕获并正确处理。
如果你需要避免这种NPE,你可以在elvis操作符中使用空安全操作符。空安全调用?在kotlin中,使用elvis的运算符是处理零安全的更好方法。 你可以在这里阅读更多关于Kotlin零安全的内容
!! 是一个断言,它不是空的。可空值后的两个感叹号将其转换为不可空类型。同时,在转换之前,不会以任何方式检查该值是否真的不包含null。因此,如果在程序执行期间发现!!操作符试图转换的值仍然为空,那么将只有一个方法-抛出NullPointerException。
Java
throws NullPointerException
科特林
simply use !!
这有助于理解