¿Qué es el operador Kotlin de doble explosión (!!)?
Estoy convirtiendo Java a Kotlin con Android Studio. Obtengo doble explosión después de la variable de instancia. ¿Cuál es el doble estallido y, lo que es más importante, dónde está documentado?
mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))
Esta es T?
una conversión insegura de tipo anulable ( ) a un tipo no anulable ( T
),
!!
se generará NullPointerException
si el valor es null
.
Está documentado aquí junto con los medios de seguridad nula de Kotlin.
A continuación se muestra un ejemplo para aclarar las cosas. Di que tienes esta función
fun main(args: Array<String>) {
var email: String
email = null
println(email)
}
Esto producirá el siguiente error de compilación.
Null can not be a value of a non-null type String
Ahora puede evitarlo agregando un signo de interrogación al String
tipo para que sea anulable.
Entonces tenemos
fun main(args: Array<String>) {
var email: String?
email = null
println(email)
}
Esto produce un resultado de
null
Ahora, si queremos que la función arroje una excepción cuando el valor del correo electrónico sea nulo, podemos agregar dos exclamaciones al final del correo electrónico. Como esto
fun main(args: Array<String>) {
var email: String?
email = null
println(email!!)
}
Esto arrojará unKotlinNullPointerException
Operador de aserción no nulo
El operador de doble explosión de Kotlin es un excelente ejemplo para los fanáticos de NullPointerException
(NPE).
El operador de aserción no nulo
!!
convierte cualquier valor a un tipo no nulo y genera una excepción si el valor es nulo.
val nonNull = str!!.length
Si escribe str!!
, devolverá un valor no nulo de str
( str
es String?
aquí) o arrojará un NPE si str
es nulo. Este operador debe usarse en los casos en que el desarrollador garantice: el valor nunca será nulo. Si desea una NPE, debe solicitarla explícitamente.
El operador !!(Double Bang) es un operador para afirmar por la fuerza una variable que acepta valores NULL como no nula.
Ejemplo: Aquí str es una cadena con valor. Pero es anulable. Dado que admite valores NULL, necesitamos manejar NULL para evitar excepciones en el tiempo de compilación.
val str :String? = "Foo"
val lowerCase = str!!.lowerCase()
Aquí si sumamos!! operador, dado que no tiene un valor nulo, funcionaría y se asignará un valor en minúsculas.
val str :String? = "Foo"
str = null
val lowerCase = str!!.lowerCase()
Pero aquí, si asigna un valor nulo y usa el valor particular, arrojará KotlinNullPointerException .
Una cosa importante aquí es que, en la mayoría de los casos, se debe evitar como !! operador a menos que esté 100% seguro de que el valor no es nulo o si la excepción se detecta y maneja correctamente.
Si necesita evitar este NPE, puede utilizar operadores seguros nulos con operadores de Elvis . nula llamada segura ?. Los operadores con Elvis son una mejor manera de manejar la seguridad nula en Kotlin. Puede leer más sobre la seguridad nula de Kotlin aquí
!! es una afirmación que no es nula. Dos signos de exclamación después de un valor que acepta valores NULL lo convierten en un tipo que no admite valores NULL. Al mismo tiempo, antes de la conversión, no se comprueba de ninguna manera que el valor realmente no contenga nulo. Por lo tanto, si durante la ejecución del programa resulta que el valor que tiene el !! operador está intentando convertir sigue siendo nulo, entonces sólo habrá una salida: lanzar una NullPointerException.