Unikanie NullPointerExceptions
Wzorce bezpiecznego kodu.
Unikanie NullPointerExceptions to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 4 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.
Cel: brak wyjątków NPE
Wyjątek NullPointerException, w skrócie NPE, występuje, gdy kod używa czegoś, co w rzeczywistości ma wartość null. Kotlin został zaprojektowany tak, aby takie sytuacje zdarzały się rzadko.
W tej lekcji połączysz poznane narzędzia i dowiesz się o kilku sposobach, przez które NPE nadal może nieoczekiwanie wystąpić.
Operator !!
Asercja nie-null !! mówi kompilatorowi, aby zaufał Ci, że wartość nie jest null. Jeśli się pomylisz, zostanie zgłoszony wyjątek NPE.
Operator ten usuwa zabezpieczenia, dlatego używaj go rzadko i tylko wtedy, gdy masz pewność.
fun main() {
val name: String? = "Ada"
println(name!!.length) // works, name is not null
}!! może spowodować awarię
Jeśli wartość rzeczywiście jest null, !! zgłosi wyjątek NullPointerException dokładnie w tej linii.
To główny sposób na ponowne wprowadzenie problemu, któremu Kotlin zapobiega. Unikaj !!, gdy wystarczyłoby bezpieczne wywołanie lub operator Elvis.
val name: String? = null
println(name!!.length)
// throws KotlinNullPointerExceptionWybieraj bezpieczne alternatywy
Prawie każde użycie !! można zastąpić wyrażeniami ?. i ?:. Bezpieczna wersja nie może spowodować awarii.
Porównaj poniżej ryzykowną i bezpieczną formę.
// Risky:
val len1 = name!!.length
// Safe:
val len2 = name?.length ?: 0Sprawdzaj z wyprzedzeniem
Obsłuż wartość null na granicy kodu, a następnie pracuj wewnątrz z wartościami różnymi od null. Użyj operatora Elvis z return lub throw, aby od razu odrzucić brakujące dane wejściowe.
Po tym zabezpieczeniu wartość jest automatycznie traktowana jako różna od null dzięki smart castowi.
fun length(s: String?): Int {
val text = s ?: return 0
return text.length
}requireNotNull
Gdy null rzeczywiście oznacza błąd, funkcja requireNotNull zgłasza jasny błąd i zwraca wartość różną od null.
Jest bardziej opisowa niż !!, ponieważ możesz dodać komunikat.
fun start(config: String?) {
val c = requireNotNull(config) { "config missing" }
println(c.length)
}Typy platformowe z Javy
Wartości pochodzące z Javy mają nieznaną dopuszczalność wartości null — nazywa się je typami platformowymi. Kotlin nie może zagwarantować, że są różne od null.
Podczas korzystania z bibliotek Java jawnie zadeklaruj oczekiwany typ i defensywnie obsłuż wartość null.
// From Java: String maybe = obj.getName();
val name: String? = obj.name // be safe
println(name?.length ?: 0)Pułapka lateinit
Element lateinit var pozwala opóźnić inicjalizację właściwości, która nie może mieć wartości null. Jednak użycie jej przed przypisaniem wartości powoduje zgłoszenie wyjątku.
Używaj lateinit tylko wtedy, gdy masz pewność, że wartość zostanie ustawiona przed każdym dostępem.
lateinit var config: String
fun read() {
println(config.length)
// crashes if config was never set
}Wartości domyślne zamiast null
Często możesz całkowicie uniknąć wartości null, wybierając rozsądną wartość domyślną. Pusty ciąg znaków lub pusta lista często sprawdzają się lepiej niż null.
Mniej typów dopuszczających null oznacza mniej okazji do wystąpienia NPE.
fun main() {
val tags: List<String> = emptyList()
println(tags.size) // 0, never null
}Bezpieczny potok
Ten program odczytuje opcjonalną wartość, bezpiecznie ją przekształca i zawsze tworzy wynik. Nie używa !! i nie powoduje awarii.
Do takiego stylu warto dążyć w rzeczywistym kodzie aplikacji na Androida.
fun main() {
val input: String? = null
val result = input?.trim()?.uppercase() ?: "N/A"
println(result) // prints: N/A
}Dobre praktyki
Preferuj typy, które nie dopuszczają null, obsługuj null na granicach kodu za pomocą operatora Elvis i używaj ?.let do opcjonalnych działań. Zachowaj !! na rzadkie przypadki, w których null jest niemożliwy.
Stosuj te zasady, a wyjątki NullPointerException odejdą w przeszłość.
val safe = data?.value ?: default
data?.let { handle(it) }Szybkie sprawdzenie
Sprawdź, czy rozumiesz, jak unikać wyjątków NullPointerException.
Podsumowanie
Wyjątki NPE w Kotlinie zwykle wynikają z użycia !!, typów platformowych pochodzących z Javy lub niezainicjalizowanych wartości lateinit. Unikaj ich, preferując typy, które nie dopuszczają null, oraz bezpieczne operatory.
Używaj ?., ?:, ?.let i sprawdzania poprawności, takiego jak requireNotNull, aby kod nie powodował awarii. Opanowałeś już najważniejsze podstawy bezpieczeństwa obsługi wartości null w Kotlinie.
Często zadawane pytania
Czy lekcja „Unikanie NullPointerExceptions” jest bezpłatna?
Tak — pełny tekst „Unikanie NullPointerExceptions” 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 „Unikanie NullPointerExceptions”?
Wzorce bezpiecznego kodu. Ć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 4 z 4.
Ile czasu zajmuje lekcja „Unikanie NullPointerExceptions”?
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