Cos'è l'operatore Kotlin double bang (!!)?


177

Sto convertendo Java in Kotlin con Android Studio. Ottengo il doppio bang dopo la variabile di istanza. Qual è il doppio botto e, soprattutto, dove è documentato?

mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))

Risposte:


205

Questo è pericoloso tipo nullable ( T?) conversione di un tipo non-nullable ( T), !!si gettano NullPointerExceptionse il valore è null.

È documentato qui insieme ai mezzi di sicurezza nulla di Kotlin.


1
cosa significa quando !!è alla fine di una frase? IJ si è convertito automaticamente in Kotlin per meval price = sale.latest!!
ycomp

7
@ycomp, significa che sale.latestpuò contenere null; l'assegnazione avrà esito positivo solo se sale.latestnon è nulla e genererà NPE in caso contrario. Questo dà sicurezza nulla per val price: il suo tipo sarà non null. Vedi kotlinlang.org/docs/reference/null-safety.html
tasto di

1
@hotkey: Qual è la differenza tra ottenere NPE - qui O quando si accede all'ultimo metodo sull'oggetto null?
Aada,

2
@Aada, è un problema comune eseguire il debug di un NPE e non è facile individuare il percorso di linea / esecuzione che imposta il valore su null. Questo incarico nullo potrebbe avvenire in un contesto, in una classe o persino in un giorno diversi! Usando !!si può fallire velocemente e individuare la causa principale di un NPE. Vorrei che Java avesse una funzione simile (vale a dire senza brutte ifdichiarazioni e / o assertioni).
Cascader,

82

Ecco un esempio per rendere le cose più chiare. Di 'che hai questa funzione

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

Ciò produrrà il seguente errore di compilazione.

Null can not be a value of a non-null type String

Ora puoi impedirlo aggiungendo un punto interrogativo al Stringtipo per renderlo nullable.

Quindi abbiamo

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

Questo produce un risultato di

null

Ora, se vogliamo che la funzione generi un'eccezione quando il valore dell'email è nullo, possiamo aggiungere due esclamazioni alla fine dell'email. Come questo

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

Questo lancerà a KotlinNullPointerException


5
Quindi, perché la gente dovrebbe usare '!!' anche se non è sicuro perché un'app verrà chiusa quando quella variabile ha null?
Sam,

3
@david puoi usarlo solo quando sei sicuro al 100% che la variabile non è nulla (es. l'hai verificata esplicitamente) e hai bisogno di una variabile non nullable
FMK

7
@FMK Ho capito, grazie! Capisco che il doppio bang viene utilizzato per rendere possibile che i valori della variabile di tipo nullable vadano nella variabile di tipi non nullable, giusto?
Sam,

2
@david sì, esattamente.
FMK,

10

L'operatore double-bang è un'opzione eccellente per i fan di NullPointerException(o in breve NPE).

L' operatore di asserzione non null !! converte qualsiasi valore in un tipo non null e genera un'eccezione se il valore è null.

val nonNull = a!!.length

Quindi puoi scrivere a!!, e questo restituirà un valore non nullo di a(un Stringesempio qui) o genera un NPE se aè nullo.

Se vuoi un NPE, puoi averlo, ma devi richiederlo esplicitamente. Questo operatore dovrebbe essere usato nei casi in cui lo sviluppatore garantisce - il valore non sarà mai nullo .


2
Chiedere come principiante: perché dovrei voler convertire qualsiasi valore in un tipo non nullo?
Wolf359

4
@ Wolf359 Ti consente di essere sicuro al 100% che il suo valore non sia nullo. ("è un problema comune eseguire il debug di un NPE e non è facile individuare la linea / il percorso di esecuzione che imposta il valore su null. Questa assegnazione nulla può avvenire in un contesto, classe o giorno diverso!" di Cascader)
riducendo l'attività
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.