web-dev-qa-db-fra.com

Qu'est-ce que l'opérateur Kotlin double-bang (!!)?

Je convertis Java en Kotlin avec Android Studio. Je reçois un double coup après la variable d'instance. Quel est le double coup et surtout où est-ce documenté?

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

Il s'agit d'une conversion de type nullable (T?) non sûre en un type non nullable (T) . Elle lancera NullPointerException si la valeur est null.

Il est documenté ici avec les moyens de sécurité nulle de Kotlin.

120
hotkey

Voici un exemple pour rendre les choses plus claires . Disons que vous avez cette fonction

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

Cela produira l'erreur de compilation suivante.

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

Vous pouvez maintenant empêcher cela en ajoutant un point d'interrogation au type String pour le rendre nullable.

Donc nous avons

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

Cela produit un résultat de 

null

Maintenant, si nous voulons que la fonction lève une exception lorsque la valeur de l'email est nulle, nous pouvons ajouter deux exclamations à la fin de l'email. Comme ça

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

Cela jettera une KotlinNullPointerException

50
Alf Moh

C'est une bonne option pour les amateurs de NullPointerException (ou NPE en abrégé): l'opérateur opérateur d'assertion non nul!! convertit n'importe quelle valeur en un type non null et lève une exception si la valeur est null. 

val lll = a!!.length

Ainsi, vous pouvez écrire a!!, et ceci retournera une valeur non nulle de a (une String ici, par exemple) ou jettera un NPE si a_ est nul .

Si vous voulez un NPE, vous pouvez l'avoir, mais vous devez le demander explicitement. Cet opérateur doit être utilisé dans les cas où le développeur garantit - la valeur ne sera jamais nulle} _.

J'espère que cela t'aides.

0
ARGeo