!!-Operator: Wann und warum Sie ihn vermeiden sollten
Verstehen Sie den Non-Null-Assertion-Operator, seine Risiken und bessere Alternativen.
!!-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.
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
- Nullable-Typen und der ?-Modifier
- Safe Call ?. und Elvis ?: im praktischen Code
- let, also und run mit Nullable-Receivern
- !!-Operator: Wann und warum Sie ihn vermeiden sollten