93 votes

La différence entre ! ! et ? en Kotlin

Je suis nouveau dans Kotlin . Je veux savoir la différence entre ces deux !! y ? dans le code ci-dessous.

J'ai les deux extraits ci-dessous, qui utilisent d'abord la fonction !! pour mCurrentDataset et une autre ayant ? pour la même variable.

if(!mCurrentDataset!!.load(mDataSetString.get(mCurrentDataSelectionIndex), STORAGE_TYPE.STORAGE_APPRESOURCE))
{
    Log.d("MyActivity","Failed to load data.")
    return false
}

if(!mCurrentDataset?.load(mDataSetString.get(mCurrentDataSelectionIndex), STORAGE_TYPE.STORAGE_APPRESOURCE)!!)
{
    Log.d("MyActivity","Failed to load data.")
    return false
}

Merci d'avance.

160voto

Alexander Romanov Points 5409

Comme il est dit dans Référence Kotlin , !! est une option pour les amateurs de NPE :)

a!!.length

retournera une valeur non nulle de a.length ou lancer un NullPointerException si a es null :

val a: String? = null
print(a!!.length) // >>> NPE: trying to get length of null

a?.length

renvoie à a.length si a n'est pas null y null autrement :

val a: String? = null
print(a?.length) // >>> null is printed in the console

Pour résumer :

+------------+--------------------+---------------------+----------------------+
| a: String? |           a.length |           a?.length |           a!!.length |
+------------+--------------------+---------------------+----------------------+
|      "cat" | Compile time error |                   3 |                    3 |
|       null | Compile time error |                null | NullPointerException |
+------------+--------------------+---------------------+----------------------+

Cela pourrait être utile : Qu'est-ce qu'une NullPointerException ?

11voto

holi-java Points 15887

La préséance des opérateurs ! , ?. , !! es ?. > !! > ! .

le site !! l'opérateur lève KotlinNullPointerException lorsqu'il fonctionne sur un null référence, par exemple :

null!!;// raise NullPointerException

l'appel sûr ?. L'opérateur retournera null lorsqu'il fonctionne sur un null référence, par exemple :

(null as? String)?.length; // return null;

le site !! l'opérateur dans votre deuxième approche peut peut-être soulever NullPointerException si le côté gauche est null par exemple :

mCurrentDataset?.load(..)!!
    ^-------------^
           | 
when mCurrentDataset== null || load() == null a NullPointerException raised.

vous pouvez utiliser l'opérateur elvis ?: au lieu de la !! dans votre cas, par exemple :

!(mCurrentDataset?.load(..)?:false)

10voto

kishu mewara Points 1564

C'est '!!' opérateur double-bang retourne toujours une valeur non nulle et ceci est ' ? opérateur d'appel sécurisé retourne la valeur si la valeur n'est pas nulle, et nulle sinon.

Il s'agit d'une conversion non sécurisée de type nullable (T ?) vers un type non nullable (T). Elle lèvera l'exception NullPointerException si la valeur est nulle.

Il est documenté ici ainsi que les moyens de Kotlin en matière de null-safety.

réf - touche de raccourci

10voto

Nitesh Ranjan Points 81
In Addition to what Alexander said and as shown in the docs too, 

le site ?. L'opérateur d'appel sécurisé est très utile dans le chaînage, quelque chose comme ceci

student?.department?.hod?.name

s'il n'y a pas d'étudiant, retourne null sinon cherche son département. Si le département n'existe pas, il renvoie un résultat nul, sinon il recherche le hod (chef de département) et ainsi de suite.

Si l'un des étudiants, départements ou modes de transport est nul, le résultat sera nul.

1voto

Opérateur SafeCall( ?):

var a: String = "abc"
a = null  //compile time error

val b: String? = null
val result = b?.length//returns null

Opérateur d'assertion ( !!):

 val b: String? = "dd" //any value or null 
 val l = b!!.length 
//this throws null pointer exception if b is null otherwise returns actual

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X