Kotlin realizuje bezpieczną pracę z null dzięki systemowi typów: każdy typ domyślnie nie może być null, na przykład val a: String = null spowoduje błąd kompilacji. Aby oznaczyć możliwość przypisania null, używa się znaku zapytania ?, na przykład:
val name: String? = null
Do pracy z typami Nullable dostępne są:
?., który zwraca null, jeśli obiekt jest null, i wywołuje metodę/pole w przeciwnym przypadku: name?.length.?:, aby ustawić wartość domyślną, jeśli z lewej strony jest null: val length = name?.length ?: 0if (name != null) { println(name.length) }
NullPointerException, jeśli obiekt jest null (używany bardzo ostrożnie):val length = name!!.length
Najlepsze praktyki: minimalizować typy Nullable, używać operatora bezpiecznego wywołania i operatora Elvisa, unikać !!, jawnie modelować sytuacje, w których null jest dozwolony.
Czy można przypisać typowi
val a: Stringwartość null, i jak tego uniknąć?
Odpowiedź: Nie, domyślnie w Kotlinie typy nie mogą być równe null. Aby pozwolić na przypisanie null, należy wyraźnie wskazać val a: String? = null. Typy bez ? są zawsze non-null.
Historia
W projekcie aplikacji bankowej zmienna typu
Userprzechowywała wynik wyszukiwania klienta. Programista zdefiniowałvar user: User, ale czasami klient nie był znajdowany i serwis zwracał null. To powodowało NPE i masowe awarie.
Historia
W czacie-bocie do wsparcia używano !! do uzyskania dostępu do wiadomości użytkownika (
message!!.text), zakładając, że wiadomości zawsze przychodzą. Bot padał na pierwszej pustej wiadomości. Bezpieczne wywołanie pozbyłoby się problemu.
Historia
W aplikacji mobilnej dane z bazy mogły nie być załadowane i przychodziły jako null. Zamiast bezpiecznego dostępu programista użył bezpośredniego dostępu, co prowadziło do awarii w każdym przypadku niepełnych danych.