Typy nullable a non-null
Znacznik typu ?.
Typy nullable a non-null to bezpłatna lekcja Android 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 Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 4 lekcji w sumie.
Dlaczego bezpieczeństwo wartości null ma znaczenie
Wiele awarii aplikacji na Androida wynika z jednego błędu: użycia wartości, której w rzeczywistości brakuje. W innych językach kończy się to przerażającym wyjątkiem NullPointerException w czasie działania programu.
Kotlin wykrywa ten problem podczas kompilacji. System typów śledzi, które wartości mogą być null, a które nigdy nie mogą. Ta lekcja przedstawia podstawy tego systemu.
Typy nienullowalne
Domyślnie typ Kotlina nie może przechowywać wartości null. String zawsze wskazuje rzeczywisty napis.
Jeśli spróbujesz przypisać do niego null, kod nawet się nie skompiluje. To bezpieślne ustawienie domyślne.
fun main() {
val name: String = "Ada"
println(name.length)
}Null jest odrzucane
Sprawdź, co się stanie, gdy spróbujesz umieścić null w typie nienullowalnym.
Kompilator zatrzyma Cię natychmiast. Błąd nie pozostanie ukryty aż do czasu działania programu.
val name: String = null // Compile error:
// Null can not be a value of a non-null type StringTypy dopuszczające null z użyciem ?
Czasami wartości rzeczywiście może brakować, na przykład opcjonalnego drugiego imienia użytkownika. Wyraź to, dodając ? do typu.
String? może przechowywać rzeczywisty napis albo null. Znak zapytania oznacza, że typ dopuszcza wartość null.
fun main() {
val middleName: String? = null
println(middleName)
}Dwa różne typy
String i String? nie są tym samym typem. Drugi z nich jest szerszym typem, który obejmuje wartość null.
To rozróżnienie pozwala kompilatorowi Cię chronić. Wie on dokładnie, gdzie może pojawić się null.
val sure: String = "hello"
val maybe: String? = "hello"
// maybe could later be null; sure never canNie można bezpośrednio używać typu dopuszczającego null
Kompilator nie pozwoli wywołać metody na wartości dopuszczającej null bez wcześniejszego sprawdzenia.
Ponieważ middleName może mieć wartość null, wywołanie na nim .length powoduje błąd kompilacji. Trzeba obsłużyć przypadek null.
val middleName: String? = null
println(middleName.length)
// Error: only safe (?.) or non-null (!!) calls allowedSprawdzanie za pomocą if
Najprostszym sposobem użycia wartości dopuszczającej null jest sprawdzenie jej za pomocą warunku if.
W gałęzi, w której potwierdzono, że wartość nie jest null, Kotlin wykonuje do niej smart cast na typ nienullowalny, dzięki czemu .length działa.
fun main() {
val text: String? = "Kotlin"
if (text != null) {
println(text.length)
}
}Smart casty
Po pomyślnym sprawdzeniu wartości null kompilator pamięta, że wartość nie jest null w pozostałej części tego bloku. Nazywa się to smart castem.
Nie trzeba było wykonywać żadnej konwersji. Kotlin śledzi to automatycznie.
fun describe(s: String?) {
if (s == null) return
// s is now treated as String here
println("Length is " + s.length)
}Parametry funkcji
To, czy parametr dopuszcza wartość null, jest częścią kontraktu funkcji. Parametr nienullowalny zapewnia wywołującym, że nigdy nie otrzyma wartości null.
Parametr dopuszczający null sygnalizuje, że brak danych wejściowych jest przewidziany i obsługiwany.
fun greet(name: String) {
println("Hi, " + name)
}
// greet(null) would not compileTypy zwracane mogą dopuszczać null
Funkcja może zwrócić null, aby zasygnalizować, że niczego nie znaleziono. Oznacz jej typ zwracany za pomocą ?.
Wywołujący wiedzą wtedy, że muszą sprawdzić wynik przed jego użyciem.
fun firstChar(s: String): Char? {
if (s.isEmpty()) return null
return s[0]
}Domyślnie wybieraj typy nienullowalne
Dobra zasada: preferuj typy nienullowalne. Dodawaj ? tylko wtedy, gdy wartości rzeczywiście może brakować.
Dzięki temu kod lepiej odzwierciedla założenia. Im mniej typów dopuszczających null, tym mniej sprawdzeń null będzie potrzebnych później.
// Prefer this:
val score: Int = 0
// Over this, unless null is meaningful:
val maybeScore: Int? = nullSzybkie sprawdzenie
Sprawdź swoją wiedzę na temat typów dopuszczających null i nienullowalnych.
Podsumowanie
Typy Kotlina są domyślnie nienullowalne i odrzucają null podczas kompilacji. Dodaj ?, aby typ dopuszczał null, gdy wartości może brakować.
Nie można bezpośrednio używać wartości dopuszczającej null. Sprawdzenie null wykonuje smart cast na typ nienullowalny, dzięki czemu można bezpiecznie użyć wartości. Następnie poznasz krótsze sposoby obsługi takich wartości.
Często zadawane pytania
Czy lekcja „Typy nullable a non-null” jest bezpłatna?
Tak — pełny tekst „Typy nullable a non-null” 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 Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Typy nullable a non-null”?
Znacznik typu ?. Ćwiczysz Android 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ąć Android Academy?
Nie wymagamy żadnego doświadczenia. Android 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 nullable a non-null”?
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 Android Academy?
Tak. Każda lekcja Android 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
- Typy nullable a non-null
- Bezpieczne wywołania i Elvis
- let, also i funkcje zakresu
- Unikanie NullPointerExceptions