Skocz do zawartości
haredzak

[Kotlin] jak uchronić się przed nullem w readLine()??

    Rekomendowane odpowiedzi

    Hej, 

    chciałbym uchronić się przed nullem, który zakańcza mój program. 

    fun main(args: Array<String>) {
    
    
        var Wielkosc: String = ""
    
        var powierzchnia: Int = 0
        var Kubatura: Int = 0
    
    
        while (true) {
            println("Wypisz rodzaj: powierzchnia, kubatura ")
            Wielkosc = readLine()!!.toString().toUpperCase()
            if (Wielkosc == "POWIERZCHNIA") {
                while (true) {
                    println("Podaj Powierzchnię (w m2):")
                    powierzchnia = readLine()!!.toInt()
                    if (powierzchnia > 0){
    
                    }
                    else {
                        println("Powierzchnia musi być większa od 0")
                    }
                }
            }
        }
    }
    
    
    
    

    myślałem, że else załatwi sprawę. Niestety nie. Co ciekawe dla Stringów else działa i pętla powróci do początku. jak to zrobić by było dobrze?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    A z czego on leci?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    @haredzak Użyj toIntOrNull() oraz operatora Elvisa ?: 

     while (true) {
                    println("Podaj Powierzchnię (w m2):")
                   // jeżeli nie uda się zamienić na Int to ustawi 0
                    powierzchnia = readLine()?.toIntOrNull() ?: 0
                    if (powierzchnia > 0){
    
                    }
                    else {
                        println("Powierzchnia musi być większa od 0")
                    }
                }

     

    • Lubię to! 1

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Dziękuję bardzo, działa. Czy mógłbyś wytłumaczyć jaką rolę pełnią znaki zapytania? Wykrzykniki z tego co wiem mówią, że wpisana wartość nie będzie nullem.  Z tej części kodu , którą wysłałeś domyślam się , że mówimy programowi coś w stylu " to może być null i jeżeli tak będzie to zastąp go liczbą 0" Pozdrawiam :)

      Pozdrawiam

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Właśnie jest trochę inaczej. Wykrzyknik mniej więcej oznacza: "dawaj mi tą zmienną! Nawet jak jest nullem!". Za pomocą pytajnika chronimy się przed NullPointerException. Zapis:

    readLine()?.toIntOrNull()

    oznacza przeczytaj linię z konsoli, ale pamiętaj że readLine() może zwrócić nulla. Jeżeli zwróci nulla to nie wywołuj metody toIntOrNull() bo wywołanie null.toIntOrNull() rzuci wyjątkiem NullPointerException 
    Gdy readLine() nie zwróci nulla to metoda toIntOrNull() zostanie wywołana i ona też może zwrócić nulla :D Stanie się tak ,gdy ktoś wprowadzi zamiast liczby jakiś tekst. Dlatego później zastosowany jest operator Elvisa ?:  który wykonuje już dokładnie to o czym napisałeś: 

    16 godzin temu, haredzak napisał:

    to może być null i jeżeli tak będzie to zastąp go liczbą 0

    Możesz spojrzeć też na temat, w którym pisałem trochę więcej o pytajnikach i wykrzyknikach:

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x