0Pricing
Kotlin Academy · Lekcja

Typy dopuszczające null i modyfikator ?

Deklaruj zmienne dopuszczające null i poznaj bezpieczeństwo null w Kotlinie na etapie kompilacji.

Typy dopuszczające null i modyfikator ? to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Bezpieczeństwo null w Kotlinie

Kotlin rozróżnia typy, które mogą przechowywać null, od tych, które nie mogą — już na etapie kompilacji. Kompilator zapobiega większości wyjątków NullPointerException jeszcze przed uruchomieniem programu.

Typ non-null

Domyślnie typ w Kotlinie nie może mieć wartości null. Jeśli spróbujesz przypisać null, kompilator odmówi kompilacji.

fun main() {
    val name: String = "Ada"
    // val nope: String = null // ERROR
    println(name)
}

Typ nullable z ?

Dodaj ?, aby dopuścić wartość null. Kompilator traktuje wtedy zmienną jako opcjonalnie nieobecną.

fun main() {
    val name: String? = null
    println(name) // null
}

Wywoływanie metod na wartościach nullable

Nie można bezpośrednio wywołać metody na wartości nullable bez wcześniejszej obsługi przypadku null. Kompilator odmówi kompilacji.

fun main() {
    val name: String? = "Bob"
    // println(name.length) // ERROR — name might be null
    if (name != null) println(name.length) // smart cast
}

Rzutowania inteligentne

Po sprawdzeniu if (x != null) Kotlin wykonuje w tej gałęzi inteligentne rzutowanie x na typ non-null.

fun main() {
    val name: String? = "Alice"
    if (name != null) {
        println("Length: ${name.length}") // safe, smart-cast
    } else {
        println("No name")
    }
}

Parametr funkcji nullable

Oznacz parametry funkcji jako nullable, gdy mogą być nieobecne. Wywołujący musi jawnie przekazać wartość albo null.

fun greet(name: String?) {
    if (name == null) println("Hello, stranger")
    else println("Hello, $name")
}
fun main() {
    greet("Sara")
    greet(null)
}

Typ zwracany nullable

Funkcja zwracająca X? informuje wywołującego, że może zwrócić null — wywołujący musi to obsłużyć.

fun findUser(id: Int): String? {
    return if (id == 1) "Alice" else null
}
fun main() {
    val u = findUser(2)
    println(u ?: "no user")
}

Właściwości nullable

Właściwości klas również mogą być nullable. Jest to częste, gdy pola są uzupełniane później lub pobierane opcjonalnie.

data class Profile(
    val name: String,
    val avatarUrl: String?
)
fun main() {
    val p = Profile("Lee", null)
    println(p.avatarUrl ?: "(no avatar)")
}

Kolekcje nullable

Rozróżniaj listę nullable List<T>? od listy wartości nullable List<T?>. Oznaczają różne rzeczy.

fun main() {
    val maybeList: List<Int>? = null
    val listOfMaybe: List<Int?> = listOf(1, null, 3)
    println(maybeList?.size)     // null
    println(listOfMaybe.size)    // 3
}

Porównanie z Javą

Typy Javy przekraczające granicę Kotlinu pojawiają się jako typy platformowe (String!) — Kotlin ufa programiście, ale nie zapewnia bezpieczeństwa null. Jeśli to możliwe, zawsze opatruj API Javy adnotacjami @Nullable/@NotNull.

fun main() {
    val maybeNull: String? = System.getenv("FOO") // null if unset
    println("env FOO = ${maybeNull ?: "(unset)"}")
}

Dlaczego to ma znaczenie

Bezpieczeństwo null w czasie kompilacji zapobiega całej klasie awarii w czasie działania. Korzystaj z modyfikatora ? — dokumentuje on intencję i wymusza obsługę wartości null.

fun divide(a: Int, b: Int): Int? = if (b == 0) null else a / b
fun main() {
    val r1 = divide(10, 2) // 5
    val r2 = divide(10, 0) // null — handled at call site
    println("$r1, $r2")
}

Szybkie sprawdzenie

Co oznacza ? na końcu deklaracji typu?

Podsumowanie

Domyślnie typy w Kotlinie nie dopuszczają wartości null. Dodaj ?, aby na nią zezwolić. Kompilator wymusza obsługę null za pomocą inteligentnych rzutowań, bezpiecznych wywołań i operatora Elvis — zapobiegając większości wyjątków NullPointerException jeszcze przed uruchomieniem programu.

Często zadawane pytania

Czy lekcja „Typy dopuszczające null i modyfikator ?” jest bezpłatna?

Tak — pełny tekst „Typy dopuszczające null i modyfikator ?” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Typy dopuszczające null i modyfikator ?”?

Deklaruj zmienne dopuszczające null i poznaj bezpieczeństwo null w Kotlinie na etapie kompilacji. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Typy dopuszczające null i modyfikator ?”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Typy dopuszczające null i modyfikator ?
  2. Bezpieczne wywołanie ?. i Elvis ?: w rzeczywistym kodzie
  3. let, also i run z odbiorcami dopuszczającymi null
  4. Operator !!: kiedy i dlaczego go unikać
← Powrót do Kotlin Academy