Kotlin Academy · Lektion

Operatoren !!

Tving non-null frem, og forstå risiciene

Lektion 3 af 413 trin

Operatoren !! er en gratis Kotlin Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Kotlin Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Kotlin Academy-kurset indeholder 4 lektioner i alt.

Tving til ikke-null

Nogle gange er du sikker på, at en værdi, der kan være null, ikke er null, men compileren klager stadig.

Operatoren til ikke-null-påstand, !!, fortæller compileren, at den skal stole på dig og behandle værdien som ikke-null.

Grundlæggende brug

Hvis du tilføjer !!, konverteres en type, der kan være null, til dens ikke-null-modstykke.

Hvis værdien faktisk ikke er null, fungerer koden præcis som et normalt kald.

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

Faren

Hvis værdien faktisk er null, kaster !! en NullPointerException med det samme.

Dette er det eneste sted, hvor Kotlin lader en NPE opstå, og det er helt dit ansvar.

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

Hvorfor den findes

Operatoren er med vilje grim. To udråbstegn skiller sig ud i en kodegennemgang og signalerer et sted, hvor du har omgået sikkerhedsnettet.

Den findes til de sjældne tilfælde, hvor du virkelig ved mere end compileren.

Et sikkert kald er normalt bedre

I de fleste situationer er et sikkert kald ?. sammen med Elvis ?: sikrere og lige så kort.

Sammenlign de to fremgangsmåder nedenfor, som opnår det samme mål.

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

Undgå at kæde !!

Kæd aldrig flere !! sammen som i a!!.b!!.c. Hvis det får programmet til at gå ned, kan du ikke se, hvilken del der var null.

Del udtrykket op, eller brug sikre kald i stedet.

fun main() {
    val text: String? = "hi"
    // bad style: text!!.uppercase()!! is hard to debug
    val good = text?.uppercase() ?: ""
    println(good)
}

Et legitimt anvendelsestilfælde

Et acceptabelt tilfælde er en værdi, som du har angivet tidligere, og som du ved er initialiseret nu.

Foretræk selv da lateinit eller en omstrukturering, når det er muligt.

fun main() {
    var config: String? = null
    config = "loaded"
    // we just assigned it, so !! is safe here
    println(config!!.uppercase())
}

Læsning af stacktracen

Når !! fejler, peger undtagelsen på den præcise linje. Den præcision er den eneste fordel sammenlignet med et lydløst forkert resultat.

Brug meddelelsen til at finde og rette den antagelse, der var forkert.

fun length(text: String?): Int {
    return text!!.length
}

fun main() {
    println(length("abc"))
    // length(null) would throw on the !! line
}

Refaktorering væk fra !!

De fleste !! kan fjernes ved at håndtere null korrekt. Nedenfor gør en Elvis-reserveværdi funktionen total og fri for nedbrud.

fun length(text: String?): Int {
    return text?.length ?: 0
}

fun main() {
    println(length("abc"))
    println(length(null))
}

Tommelfingerregel

Betragt hvert !! som et spørgsmål: Er jeg helt sikker på, at dette aldrig er null?

  • Hvis ja, og det sker sjældent → acceptabelt
  • Hvis du er usikker → brug ?. og ?:

Samlet overblik

Operatoren !! er et skarpt værktøj:

  • Den tvinger en værdi, der kan være null, over i en ikke-null-type
  • Den kaster en NullPointerException, hvis værdien er null
  • Foretræk sikre kald og Elvis i næsten alle tilfælde
fun main() {
    val sure: String? = "definitely here"
    println(sure!!.length)
    val maybe: String? = null
    println(maybe?.length ?: -1)
}

Hurtigt tjek

Test din forståelse af operatoren til ikke-null-påstand.

Opsummering

Du har lært om operatoren !!:

  • Den hævder, at en værdi, der kan være null, ikke er null
  • Den kaster en NullPointerException, når antagelsen er forkert
  • Den bør være sidste udvej, ikke en vane

Nu skal du se, hvordan nullbarhed kommer fra Java via platformtyper.

Gratis at komme i gang

Lær Kotlin med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Operatoren !!” gratis?

Ja — alle 3 lektioner i læringssporet Kotlin Academy, inklusive “Operatoren !!”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Kotlin Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Operatoren !!”?

Tving non-null frem, og forstå risiciene Du øver dig i Kotlin Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Kotlin Academy?

Der kræves ingen tidligere erfaring. Kotlin Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Operatoren !!”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Kotlin Academy-lektion?

Ja. Alle Kotlin Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Nullable- og non-null-typer
  2. Sikre kald og Elvis
  3. Operatoren !!
  4. Platformstyper
← Tilbage til Kotlin Academy