!!-operatoren: Når og hvorfor den bør unngås
Forstå non-null assertion-operatoren, risikoene ved den og bedre alternativer.
!!-operatoren: Når og hvorfor den bør unngås er en gratis leksjon i Kotlin Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Kotlin Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.
Hva er !!?
Operatoren non-null assertion !! konverterer en nullable-type til en ikke-null-type. Hvis verdien er null under kjøring, kastes NullPointerException.
Grunnleggende bruk av !!
x!! returnerer x hvis den ikke er null, og kaster ellers NPE.
fun main() {
val name: String? = "Kotlin"
val len: Int = name!!.length // 6
println(len)
}!! kaster et unntak ved null
Hvis verdien faktisk er null, oppstår nettopp unntaket Kotlin forsøker å forhindre.
fun main() {
val name: String? = null
try {
println(name!!.length)
} catch (e: NullPointerException) {
println("NPE caught!")
}
}Bedre: Safe call
Foretrekk ?. fremfor !! – dette gir håndtering uten krasj.
fun main() {
val name: String? = null
val len = name?.length
println(len) // null — no crash
}Bedre: Elvis-operatoren
Kombiner ?. med ?: for å angi en fornuftig reserveverdi.
fun main() {
val name: String? = null
val len = name?.length ?: 0
println(len) // 0
}Bedre: Smart casting
En sjekk med if (x != null) aktiverer smart casting – !! er ikke nødvendig.
fun main() {
val name: String? = "Alice"
if (name != null) {
println(name.length) // smart-cast to String
}
}Bedre: requireNotNull
Hvis verdien må finnes, kaster requireNotNull(x) { "..." } en meningsfull IllegalArgumentException.
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
}Bedre: checkNotNull
checkNotNull(x) fungerer på samme måte, men kaster IllegalStateException – bruk dette for invarianter.
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())
}Berettiget bruk av !!
Sjelden, men gyldig: når fravær av null er en reell invariant som ikke kan bevises ved kompilering (for eksempel etter et refleksjonskall). Kommenter hvorfor.
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)
}Kjedede !! – det ultimate antimønsteret
Flere !! i en kjede er et dårlig tegn. Refaktorer med safe calls og guard-klausuler.
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)
}Refaktorere bort !!
Erstatt !! med et mer ærlig API: nullable-returverdier, requireNotNull ved inngangen eller en tidlig retur.
fun firstUpper(s: String?): String? = s?.firstOrNull()?.uppercase()
fun main() {
println(firstUpper("alice")) // A
println(firstUpper("")) // null
println(firstUpper(null)) // null
}Hurtigsjekk
Hva skjer hvis !! brukes på en verdi som faktisk er null under kjøring?
Oppsummering
!! er en utvei som setter Kotlin null-sikkerhet til side. Foretrekk ?., ?:, smart casting, requireNotNull eller checkNotNull. Bruk !! bare for dokumenterte invarianter som kompilatoren ikke kan bevise.
Lær deg Kotlin med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 51
- Leksjoner
- 203
Ofte stilte spørsmål
Er leksjonen «!!-operatoren: Når og hvorfor den bør unngås» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Kotlin Academy, inkludert «!!-operatoren: Når og hvorfor den bør unngås», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «!!-operatoren: Når og hvorfor den bør unngås»?
Forstå non-null assertion-operatoren, risikoene ved den og bedre alternativer. Du øver på Kotlin Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Kotlin Academy?
Ingen tidligere erfaring er nødvendig. Kotlin Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «!!-operatoren: Når og hvorfor den bør unngås»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Kotlin Academy-leksjonen?
Ja. Alle Kotlin Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Nullable-typer og ?-modifikatoren
- Safe call ?. og Elvis ?: i praktisk kode
- let, also og run med nullable-mottakere
- !!-operatoren: Når og hvorfor den bør unngås