866 votes

Comment vérifier si une variable "lateinit" a été initialisée ?

Je me demande s'il existe un moyen de vérifier si un lateinit a été initialisée. Par exemple :

class Foo() {

    private lateinit var myFile: File

    fun bar(path: String?) {
        path?.let { myFile = File(it) }
    }

    fun bar2() {
        myFile.whateverMethod()
        // May crash since I don't know whether myFile has been initialized
    }
}

3 votes

Ce qu'il vous faut peut-être, c'est rendre la propriété nullable (changer le type en File? ) et vérifier si elle est nulle à la place ?

1 votes

J'ai essayé et cela va fonctionner, mais je vais devoir modifier le fichier allSeries var to seriesDir?.listFiles()?.map { it.name }?.toTypedArray() ce qui n'est pas très "joli"

1 votes

Vous pouvez effectuer une simple vérification de la nullité et le smart cast rendra le tout plus joli. if (seriesDir != null) { allSeries = seriesDir.listFiles().map { it.name }.toTypedArray() }

27voto

Bharat Lalwani Points 49

Cela fonctionnera

if (::list.isInitialized) {
 //true
} 
else {
//false
}

21voto

Gigantic Points 4447

Pour vérifier si un lateinit var ont été initialisés ou non, utiliser un .isInitialized sur la référence à ce bien :

if (foo::bar.isInitialized) {
    println(foo.bar)
}

Cette vérification n'est disponible que pour les propriétés accessibles lexicalement, c'est-à-dire déclarées dans le même type ou dans l'un des types extérieurs, ou au niveau supérieur dans le même fichier.

21voto

Hissain Points 880

Réponse acceptée me donne une erreur de compilation dans Kotlin 1.3+ J'ai dû mentionner explicitement la this mot-clé avant :: . Voici le code de travail.

lateinit var file: File

if (this::file.isInitialized) {

    // file is not null
}

11voto

Aalishan Ansari Points 72

Pour moi, cela a fonctionné

if (::file.isInitialized) {
 //true
} 
else {
//false
}

3voto

takharsh Points 1008
kotlin.UninitializedPropertyAccessException: lateinit property clientKeypair has not been initialized

Bytecode dit...blah blah...

public final static synthetic access$getClientKeypair$p(Lcom/takharsh/ecdh/MainActivity;)Ljava/security/KeyPair;

`L0
LINENUMBER 11 L0
ALOAD 0
GETFIELD com/takharsh/ecdh/MainActivity.clientKeypair : Ljava/security/KeyPair;
DUP
IFNONNULL L1
LDC "clientKeypair"
INVOKESTATIC kotlin/jvm/internal/Intrinsics.throwUninitializedPropertyAccessException (Ljava/lang/String;)V
    L1
ARETURN

L LOCALVARIABLE $this Lcom/takharsh/ecdh/MainActivity ; L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1

Kotlin crée une variable locale supplémentaire de la même instance et vérifie si elle est nulle ou non. Si elle est nulle, elle lance une exception de type "throwUninitializedPropertyAccessException", sinon elle renvoie l'objet local. Explication du bytecode ci-dessus aquí Solution Depuis kotlin 1.2, il est possible de vérifier si la variable lateinit a été initialisée ou non à l'aide de la fonction .isInitialized

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