¿Qué es el operador Kotlin de doble explosión (!!)?

Resuelto mbr_at_ml asked hace 8 años • 7 respuestas

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"))
mbr_at_ml avatar Dec 18 '15 02:12 mbr_at_ml
Aceptado

Esta es T?una conversión insegura de tipo anulable ( ) a un tipo no anulable ( T), !!se generará NullPointerExceptionsi el valor es null.

Está documentado aquí junto con los medios de seguridad nula de Kotlin.

hotkey avatar Dec 17 '2015 19:12 hotkey

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 Stringtipo 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

Alf Moh avatar May 29 '2017 18:05 Alf Moh

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( stres String?aquí) o arrojará un NPE si stres 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.

Andy Jazz avatar Jan 10 '2019 21:01 Andy Jazz

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í

Gowtham K K avatar Aug 16 '2022 07:08 Gowtham K K

!! 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.

Vlad Tkachev avatar May 16 '2022 16:05 Vlad Tkachev