Kotlin Academy · Leçon

Opérateur !! : quand et pourquoi l’éviter

Comprenez l’opérateur d’affirmation de non-nullité, ses risques et les meilleures solutions de remplacement.

Leçon 4 sur 413 étapes

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.

Gratuit pour commencer

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

  1. Types nullables et modificateur ?
  2. Appel sécurisé ?. et Elvis ?: en pratique
  3. let, also et run avec des récepteurs nullables
  4. Opérateur !! : quand et pourquoi l’éviter
← Retour à Kotlin Academy