Je suis nouveau sur Kotlin . Je veux connaître la différence entre ces deux !!
et ?
dans le code ci-dessous.
J'ai au-dessous de deux bouts de code ayant d'abord utiliser !!
pour mCurrentDataset et un 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.
Comme il est dit dans La référence Kotlin , !!
est une option pour les amateurs de NPE :)
a!!.length
renverra une valeur non nulle de a.length
ou émettra une NullPointerException si a
est null
:
val a: String? = null
print(a!!.length) // >>> NPE: trying to get length of null
a?.length
retourne a.length
si a
n'est pas null
et null
sinon:
val a: String? = null
print(a?.length) // >>> null is printed in the console
+------------+--------------------+---------------------+----------------------+
| a: String? | a.length | a?.length | a!!.length |
+------------+--------------------+---------------------+----------------------+
| "cat" | Compile time error | 3 | 3 |
| null | Compile time error | null | NullPointerException |
+------------+--------------------+---------------------+----------------------+
Pourrait être utile: Qu'est-ce qu'une exception NullPointerException?
la priorité des opérateurs !
, ?.
, !!
est ?.
> !!
> !
.
l'opérateur !!
lève KotlinNullPointerException
lorsqu'il opère sur une référence null
, par exemple:
null!!;// raise NullPointerException
l'opérateur sûr appel ?.
retournera null
lorsqu'il opère sur une référence null
, par exemple:
(null as? String)?.length; // return null;
l'opérateur !!
dans votre deuxième approche peut lever 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 l'opérateur !!
dans votre cas, par exemple:
!(mCurrentDataset?.load(..)?:false)
c'est '!!' L'opérateur double-bang renvoie toujours une valeur non nulle et correspond à '?' l'opérateur d'appel sûr renvoie la valeur si la valeur n'est pas null et la valeur null sinon
Il s'agit d'une conversion de type nullable (T?) Non sécurisée en un type (N) non nullable. Il lancera NullPointerException si la valeur est null.
Il est documenté ici avec les moyens de sécurité nulle de Kotlin.
réf - raccourci clavier
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
In Addition to what Alexander said and as shown in the docs too,
l'opérateur d'opérateur ?.
est très utile pour le chaînage, quelque chose comme ceci
student?.department?.hod?.name
s'il n'y a pas d'étudiant, renvoie null sinon cherche son département. Si le département n'existe pas, renvoie null, sinon recherchez hod (chef de département), etc.
Si l'un des étudiants, département ou hod est nul, le résultat sera nul.