Opérateur !! : quand et pourquoi l’éviter
Comprenez l’opérateur d’affirmation de non-nullité, ses risques et les meilleures solutions de remplacement.
Opérateur !! : quand et pourquoi l’éviter est une leçon Kotlin Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Kotlin Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Kotlin Academy comprend 4 leçons au total.
Qu’est-ce que !! ?
L’opérateur d’assertion de non-nullité !! convertit un type nullable en type non nullable. Si la valeur est null lors de l’exécution, il lève une NullPointerException.
Utilisation de base de !!
x!! renvoie x si la valeur n’est pas null ; sinon, il lève une exception NPE.
fun main() {
val name: String? = "Kotlin"
val len: Int = name!!.length // 6
println(len)
}!! lève une exception pour null
Si la valeur est effectivement null, vous obtenez précisément l’exception que Kotlin cherche à empêcher.
fun main() {
val name: String? = null
try {
println(name!!.length)
} catch (e: NullPointerException) {
println("NPE caught!")
}
}Mieux : l’appel sûr
Au lieu de !!, préférez ?. : vous obtenez une gestion progressive du cas null sans plantage.
fun main() {
val name: String? = null
val len = name?.length
println(len) // null — no crash
}Mieux : l’opérateur Elvis
Associez ?. à ?: pour fournir une valeur par défaut raisonnable.
fun main() {
val name: String? = null
val len = name?.length ?: 0
println(len) // 0
}Mieux : la conversion intelligente
Une vérification if (x != null) active une conversion intelligente de type, sans avoir besoin de !!.
fun main() {
val name: String? = "Alice"
if (name != null) {
println(name.length) // smart-cast to String
}
}Mieux : requireNotNull
Si la valeur doit être présente, requireNotNull(x) { "..." } lève une IllegalArgumentException explicite.
fun process(name: String?) {
val safe = requireNotNull(name) { "name is required" }
println("processing $safe")
}
fun main() {
process("Ada")
// process(null) // throws IllegalArgumentException: name is required
}Mieux : checkNotNull
checkNotNull(x) se comporte de la même manière, mais lève une IllegalStateException : utilisez-le pour vérifier des invariants.
class Service {
private var data: String? = null
fun load() { data = "loaded" }
fun read(): String = checkNotNull(data) { "load() must be called first" }
}
fun main() {
val s = Service()
s.load()
println(s.read())
}Utilisations légitimes de !!
Cas rare, mais valide : lorsque l’absence de null constitue un véritable invariant impossible à prouver lors de la compilation (par exemple après un appel réflexif). Commentez la raison.
fun main() {
val list = listOf(1, 2, 3)
val firstEven: Int = list.find { it % 2 == 0 }!! // safe: we know list has an even
println(firstEven)
}!! en chaîne : l’anti-modèle ultime
Plusieurs occurrences de !! dans une chaîne sont un signe de mauvaise conception. Refactorisez le code avec des appels sûrs et des clauses de garde.
class A(val b: B?)
class B(val c: C?)
class C(val name: String?)
fun main() {
val a: A? = A(B(C("ok")))
// BAD: val n = a!!.b!!.c!!.name!!
val n = a?.b?.c?.name ?: "unknown"
println(n)
}Supprimer !! par refactorisation
Remplacez !! par une API plus explicite : des valeurs de retour nullables, requireNotNull à l’entrée ou un retour anticipé.
fun firstUpper(s: String?): String? = s?.firstOrNull()?.uppercase()
fun main() {
println(firstUpper("alice")) // A
println(firstUpper("")) // null
println(firstUpper(null)) // null
}Vérification rapide
Que se passe-t-il si vous appliquez !! à une valeur qui est effectivement null lors de l’exécution ?
Récapitulatif
!! est la sortie de secours qui neutralise la sécurité vis-à-vis de null de Kotlin. Préférez ?., ?:, les conversions intelligentes de types, requireNotNull ou checkNotNull. Réservez !! aux invariants documentés que le compilateur ne peut pas prouver.
Apprends Kotlin avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 51
- Leçons
- 203
Questions Fréquemment Posées
La leçon « Opérateur !! : quand et pourquoi l’éviter » est-elle gratuite ?
Oui — le texte complet de « Opérateur !! : quand et pourquoi l’éviter » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Kotlin Academy, passe à CoddyKit PRO. Le cours Kotlin Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Opérateur !! : quand et pourquoi l’éviter » ?
Comprenez l’opérateur d’affirmation de non-nullité, ses risques et les meilleures solutions de remplacement. Tu pratiques Kotlin Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Kotlin Academy ?
Aucune expérience préalable n'est requise. Kotlin Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Opérateur !! : quand et pourquoi l’éviter » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Kotlin Academy ?
Oui. Chaque leçon Kotlin Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Types nullables et modificateur ?
- Appel sécurisé ?. et Elvis ?: en pratique
- let, also et run avec des récepteurs nullables
- Opérateur !! : quand et pourquoi l’éviter