0Pricing
Kotlin Academy · Lekcja

Operator !!

Wymuszanie non-null i związane z tym ryzyko

Operator !! to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 3 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.

Wymuszanie wartości non-null

Czasami mają Państwo pewność, że wartość nullable nie jest równa null, ale kompilator nadal zgłasza błąd.

Operator asercji non-null !! nakazuje kompilatorowi zaufać Państwu i potraktować wartość jako non-null.

Podstawowe użycie

Dodanie !! konwertuje typ nullable na odpowiadający mu typ non-null.

Jeśli wartość rzeczywiście nie jest równa null, kod działa dokładnie tak jak zwykłe wywołanie.

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

Zagrożenie

Jeśli wartość faktycznie wynosi null, operator !! natychmiast zgłasza NullPointerException.

To jedyne miejsce, w którym Kotlin pozwala na wystąpienie NPE, a pełna odpowiedzialność spoczywa na Państwu.

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

Dlaczego ten operator istnieje

Ten operator celowo wygląda nieprzyjaźnie. Dwa wykrzykniki od razu rzucają się w oczy podczas przeglądu kodu i sygnalizują miejsce, w którym zrezygnowali Państwo z mechanizmu bezpieczeństwa.

Istnieje na wypadek rzadkich sytuacji, gdy wiedzą Państwo naprawdę więcej niż kompilator.

Zwykle lepiej użyć bezpiecznego wywołania

W większości sytuacji bezpieczne wywołanie ?. z operatorem Elvis ?: jest bezpieczniejsze i równie krótkie.

Poniżej można porównać oba podejścia dla tego samego celu.

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

Unikajcie Państwo łańcuchów !!

Nigdy nie należy łączyć wielu operatorów !!, na przykład a!!.b!!.c. Jeśli kod ulegnie awarii, nie będzie wiadomo, która część miała wartość null.

Należy rozbić wyrażenie na części albo użyć bezpiecznych wywołań.

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

Uzasadnione użycie

Jednym z akceptowalnych przypadków jest wartość ustawiona wcześniej, o której wiadomo, że do tej pory została zainicjalizowana.

Nawet wtedy, jeśli to możliwe, lepiej użyć lateinit albo zmienić strukturę kodu.

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

Czytanie śladu stosu

Gdy operator !! zawiedzie, wyjątek wskazuje dokładny wiersz. Ta precyzja jest jedyną zaletą w porównaniu z cichym zwróceniem nieprawidłowego wyniku.

Należy użyć komunikatu, aby znaleźć i naprawić błędne założenie.

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

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

Usuwanie !! przez refaktoryzację

Większość operatorów !! można usunąć, odpowiednio obsługując wartości null. Poniżej wartość zastępcza operatora Elvis sprawia, że funkcja jest określona dla każdego argumentu i nie powoduje awarii.

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

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

Praktyczna zasada

Każdy operator !! należy traktować jak pytanie: czy mam absolutną pewność, że ta wartość nigdy nie będzie równa null?

  • Jeśli tak i zdarza się to rzadko → jest to dopuszczalne
  • Jeśli nie mają Państwo pewności → należy użyć ?. i ?:

Zastosowanie w praktyce

Operator !! jest narzędziem, z którym trzeba obchodzić się ostrożnie:

  • Wymusza konwersję wartości nullable na typ non-null
  • Zgłasza NullPointerException, jeśli wartość wynosi null
  • W niemal każdym przypadku należy preferować bezpieczne wywołania i operator Elvis
fun main() {
    val sure: String? = "definitely here"
    println(sure!!.length)
    val maybe: String? = null
    println(maybe?.length ?: -1)
}

Szybkie sprawdzenie

Sprawdźcie Państwo swoją wiedzę na temat operatora asercji non-null.

Podsumowanie

Poznali Państwo operator !!:

  • Potwierdza, że wartość nullable nie jest równa null
  • W przypadku błędnego założenia zgłasza NullPointerException
  • Powinien być ostatecznością, a nie nawykiem

W następnej części zobaczą Państwo, jak wartości null trafiają z Javy do Kotlina za pośrednictwem typów platformowych.

Często zadawane pytania

Czy lekcja „Operator !!” jest bezpłatna?

Tak — pełny tekst „Operator !!” 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 „Operator !!”?

Wymuszanie non-null i związane z tym ryzyko Ć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 3 z 4.

Ile czasu zajmuje lekcja „Operator !!”?

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 nullable i non-null
  2. Bezpieczne wywołania i Elvis
  3. Operator !!
  4. Typy platformowe
← Powrót do Kotlin Academy