Kotlin Academy · Lektion

!!-Operator: Wann und warum Sie ihn vermeiden sollten

Verstehen Sie den Non-Null-Assertion-Operator, seine Risiken und bessere Alternativen.

Lektion 4 von 413 Schritte

!!-Operator: Wann und warum Sie ihn vermeiden sollten ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist !!?

Der Nicht-Null-Assertion-Operator !! wandelt einen Nullable-Typ in einen nicht-nullbaren Typ um. Wenn der Wert zur Laufzeit null ist, löst er eine NullPointerException aus.

Grundlegende Verwendung von !!

x!! gibt x zurück, wenn es nicht null ist, andernfalls wird eine NPE ausgelöst.

fun main() {
    val name: String? = "Kotlin"
    val len: Int = name!!.length // 6
    println(len)
}

!! löst bei null eine Ausnahme aus

Wenn der Wert tatsächlich null ist, erhalten Sie genau die Ausnahme, die Kotlin eigentlich verhindern soll.

fun main() {
    val name: String? = null
    try {
        println(name!!.length)
    } catch (e: NullPointerException) {
        println("NPE caught!")
    }
}

Besser: Safe Call

Verwenden Sie statt !! bevorzugt ?. – für eine kontrollierte Behandlung ohne Abstürze.

fun main() {
    val name: String? = null
    val len = name?.length
    println(len) // null — no crash
}

Besser: Elvis-Operator

Kombinieren Sie ?. mit ?:, um einen sinnvollen Standardwert bereitzustellen.

fun main() {
    val name: String? = null
    val len = name?.length ?: 0
    println(len) // 0
}

Besser: Smart Cast

Eine Prüfung mit if (x != null) ermöglicht einen Smart Cast – !! ist nicht erforderlich.

fun main() {
    val name: String? = "Alice"
    if (name != null) {
        println(name.length) // smart-cast to String
    }
}

Besser: requireNotNull

Wenn der Wert vorhanden sein muss, löst requireNotNull(x) { "..." } eine aussagekräftige IllegalArgumentException aus.

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
}

Besser: checkNotNull

checkNotNull(x) verhält sich genauso, löst aber eine IllegalStateException aus – verwenden Sie es für Invarianten.

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())
}

Berechtigte Einsatzfälle von !!

Selten, aber gültig: wenn die Nullfreiheit tatsächlich eine Invariante ist, die zur Compilezeit nicht beweisbar ist (z. B. nach einem reflektiven Aufruf). Kommentieren Sie, warum.

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)
}

Verkettete !! – maximales Anti-Pattern

Mehrere !! in einer Kette sind ein Code-Smell. Strukturieren Sie den Code mit Safe Calls und Guard Clauses um.

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)
}

!! entfernen

Ersetzen Sie !! durch eine ehrlichere API: nullable Rückgabewerte, requireNotNull am Einstiegspunkt oder eine vorzeitige Rückgabe.

fun firstUpper(s: String?): String? = s?.firstOrNull()?.uppercase()
fun main() {
    println(firstUpper("alice")) // A
    println(firstUpper(""))      // null
    println(firstUpper(null))    // null
}

Schnelltest

Was passiert, wenn Sie !! auf einen Wert anwenden, der zur Laufzeit tatsächlich null ist?

Zusammenfassung

!! ist der Ausweg, der die Null-Sicherheit von Kotlin aushebelt. Bevorzugen Sie ?., ?:, Smart Casts, requireNotNull oder checkNotNull. Verwenden Sie !! nur für dokumentierte Invarianten, die der Compiler nicht beweisen kann.

Kostenlos starten

Lerne Kotlin mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
51
Lektionen
203

Häufig gestellte Fragen

Ist die Lektion „!!-Operator: Wann und warum Sie ihn vermeiden sollten“ kostenlos?

Ja — der vollständige Text von „!!-Operator: Wann und warum Sie ihn vermeiden sollten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „!!-Operator: Wann und warum Sie ihn vermeiden sollten“?

Verstehen Sie den Non-Null-Assertion-Operator, seine Risiken und bessere Alternativen. Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Kotlin Academy zu starten?

Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „!!-Operator: Wann und warum Sie ihn vermeiden sollten“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?

Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Nullable-Typen und der ?-Modifier
  2. Safe Call ?. und Elvis ?: im praktischen Code
  3. let, also und run mit Nullable-Receivern
  4. !!-Operator: Wann und warum Sie ihn vermeiden sollten
← Zurück zu Kotlin Academy