En tant que développeur, l’un des bugs les plus récurant que l’on rencontre dans nos applications c’est NullPointerException. Cela se produit par exemple lorsqu’un utilisateur clique sur un bouton dans votre application et vous appelez une méthode sur une variable contenant une valeur null.
Imaginez un instant qu’aujourd’hui il est possible d’éliminer cette exception qui se produit durant l’exécution de vos applications.Cela est possible grâce au système de type de Kotlin qui vise à éliminer le risque de référence null dans votre code.
Dans ce tutoriel, nous allons voir comment éliminer les risques de référence null en Kotlin ( Kotlin Null Safety ) .
Table des matières
Types Null (Nullable types)
Par défaut dans kotlin, le compilateur n’autorise pas aux variables de référencer une valeur null. Par exemple ,le code suivant génère une erreur dans Kotlin
var nom: String = "Joel" nom = null; //Erreur: Null can not be a value of non-null type String
C’est grâce au système de nulabilité dans kotlin , que vous pouvez explicitement déclarer une variable pouvant contenir une valeur null ou non.
Ce qui permet donc au compilateur de savoir d’avance qu’une variable peut référencer une valeur null.Il pourra ainsi vous imposer de vérifier si cette variable est null avant d’appeler une méthode sur cette variable ou d’accéder à une propriété de cette variable.
C’est ainsi que Kotlin vous permet d’éliminer l’exception NullPointerException .Nous allons voir cela plus en détail.
Pour notifier au compilateur dans kotlin que vous souhaitez déclarer une variable pouvant contenir une valeur null, vous devez ajouter un point d’interrogation (?) après le type de la variable comme suit.
var nom: String? = "Joel" nom = null;
En ajoutant un point d’ineterrogation à la fin du type de la variable nom dans l’exemple précédent, le compilateur sait que la variable nom peut contenir un valeur null et donc vous empêché d’appeler un méthode ou d’accéder à une propriété de la variable nom, pour éviter l’exception NullPointerException. .
Le code suivant ne fonctionne pas dans Kotlin
var nom: String? = "Joel" nom=null nom.length // Le compilateur génere une erreur nom.trim() // Le compilateur génere une erreur
Avant d’appeler une méthode ou d’accéder à une propriété d’une variable pouvant référencer une valeur null, vous devez vérifier que cette variable n’est pas null.
Types Non Null (Non-Null Types)
Par défaut une variable dans Kotlin est de type non null. Donc vous n’avez besoin de ne rien faire pour déclarer une variable de type non null
var nom: String = "Joel" val nb: Int = nom.length // Correct nom.trim() // Correct
A présent vous savez comment indiquer au compilateur que vous souhaitez avoir une variable pouvant contenir une valeur null. Et le compilateur vous empêchera d’appeler une méthode ou d’accéder à une propriété de cette variable pouvant contenir une valeur null.
Il vous reste à présent à savoir comment effectuer une vérification sur une variable pouvant contenir une valeur null avant de l’utiliser.Le compilateur vous aura ainsi épargner de l’exception NullPointerException .
Existe plusieurs manières de vérifier si une variable est null avant de pouvoir l’utiliser
Vérification de la nulabilité d’une variable
Pour vérifier si une variable est null avant de l’utiliser, vous devez effectuer une vérification comme on le fait dans la la plupart des langages tel que Java.Voir le code suivant
var nom: String? = "Joel" if( nom!=null){ println("Bonjour Mr $nom") } else{ print("Vore nom est incorrect") }
L’opérateur d’appel sécurisé ?. ( Safe call operator: ? )
Il existe dans Kotlin, une manière simple et concise d’appeler une méthode sur une variable si et seulement si cette variable ne fait pas référence à une valeur null.
Cela est possible grâce à l’opérateur ?. .EN fait cette opérateur combine deux choses à la fois:
- Vérifier si la variable contient une valeur null
- Et l’appelle d’une méthode sur la variable si la valeur référencée par la variable n’est pas nul, tout cela se fait en une seul expression
Voir le code suivant
ar nom: String? = "Joel" nom?.toLowerCase()
L’opérateur d’appel sécurisé ?. et la méthode let
En utilisant l’opérateur ?. et la méthode let, vous pourrez exécuter un bloc de code lorsque la variable n’est pas null. Dans un prochain tutoriel nous parlerons de la méthode let dans Koltin.
var nom: String? = "Joel" nom?.let{ it.toLowerCase() it.trim() }
L’opérateur Elvis: ?: (Elvis operator)
L’opérateur Elvis permet de définir une valeur par défaut lorsque le variable fait référence à un valeur null. Voir l’examole de code suivant
var nom: String? = "Joel" val nomPersonne = nom ?: "Noe"
Vous pouvez combiner l’opérateur d’appel sécurisé (?.) et l’opérateur Elvis (?:) pour affecter une valeur par défaut lorsque la variable sur laquelle la méthode est appelé est null ou lorsque la variable sur laquelle on n’essai d’accéder à une propriété est null .
Donc l’opérateur Elvis permet de fournir une valeur par défaut ou d’exécuter une bloc de code lorsque la valeur contenu dans la variable vérifiée par l’opérateur d’appel sécurisé est null.
Voir l’exemple de code suivant
var nom: String? = "Joel" val rep: String = nom?.toLowerCase() ?: "Votre nom est incorrect"
La valeur contenue dans la variable rep est « Joel »
var nom: String? = null val rep: String = nom?.toLowerCase() ?: "Votre nom est incorrect"
La valeur contenue dans la variable rep est « Votre nom est incorrect »
L’opérateur !! (The !!
Operator)
L’opérateur d’assertion non null !!, contrairement à l’opérateur d’appel sécurisé (?.) permet de convertir une variable de type null en une variable de type non null puis lance l’exception NullPointerException si:
- cette variable contient une valeur null
- et on essai d’appeler une méthode ou on essaie d’accéder à une propriété de cette variable
Voir l’exemple de code suivant.
var nom: String? = null nom!!.toLowerCase() //Erreur
Collections of Nullable Type
L’API Collection de Kotlin, vous permet de déclarer une collection pouvant contenir des éléments null
Voir l’exemple de code suivant
val listNumbers: List<Int?> = listOf(1,2,null,4)
Pour filtrer la collection et récupérer uniquement les éléments non null,on procède ainsi
val listNumbers: List<Int?> = listOf(1,2,null,4) val listNumbers2: List<Int> =listNumbers.filterNotNull()
Nullable Collection
Dans Kotlin vous pouvez aussi déclarer un collection pouvant être null comme suit
var listNumbers: List<Int>? = listOf(1,2,4) listNumbers = null // On définit la valeur de la collection à null
Nullable Collection of Nullable Types
Vous pouvez aussi déclarer une collection pouvant être null et pouvant contenir des éléments null comme suit
var listNumbers: List<Int?>? = listOf(1,2,4,null,6,null) listNumbers = null // On définit la valeur de la collection à null
Conclusion
Dans ce tutoriel nous avons appris comment éliminer les risques de référence null en vérifiant de manière simple et concise les variables pouvant contenir une valeur null avant de les utilisées.
Noe Joel Vigan, auteur de ce blog, est passionné par la programmation Android. Il a créé ce blog pour partager ses connaissances sur le développement d’application android. Il est Développeur Android Fullstack, ce qui lui permet de complètement mettre en place le Backend de ses applications sur Google Cloud à défaut d’utiliser FireBase.