Niedorzeczny problem - wyjątki

0

Dlaczego po wpisaniu double'a z wymaganego zakresu 'program' zapętla się w nieskończoność? Nie zrozumiałem wyjątków, to głupi błąd czy oba?

/*class mOutOfRangeExc extends RuntimeException {
}*/

        PrintStream so = new PrintStream(System.out);
        Scanner sc = new Scanner(System.in);
        int number = -1;
        boolean valid = false;
        while (!valid)
        {
            try {
                so.println(" Podaj liczbe z przedzialu [0, 99]: ");
                number = sc.nextInt();
                if ((number < 0) || (number > 99)) throw new mOutOfRangeExc();
            }
            catch(InputMismatchException ime)
            {
                so.println(" To nie jest liczba calkowita !");
                so.println(" Komunikat systemowy: " + ime);
                number = -1;
            }
            catch (mOutOfRangeExc moore)
            {
                so.println(" Podano liczbe spoza zakresu !");
            }
            valid = ((number < 0) || (number > 99)) ? false : true;
        }
0

To takie specyficzne działanie klasy Scanner...
Gak nextInt() rzuci wyjątek, to następny next*() będzie sprawdzał to samo, zamiast czytać nowy input.

w bloku catch dodaj
sc.next();

0

Używanie wyjątków do sprawdzania czy liczba mieści się w zakresie jest bardzo złym pomysłem.

0

Sterowanie przepływem za pomocą wyjątków to bardzo, ale to bardzo zły pomysł. Szczególnie w Javie.

Dlaczego nie? Ponieważ podanie przez użytkownika danych z poza zakresu nie jest sytuacją wyjątkową tylko typowym przypadkiem użycia. Użytkownik może podać złe dane i tyle. Nasza rolą jest sprawdzenie poprawności danych i w razie czego obsłużenie niepoprawnych informacji.

0

Zacznę od podziękowań:

dla Kerai: bezpośrednio rozwiązało problem (*)
dla ŁF: fakt, od razu nice&simple
dla bo i Koziołka: za łagodne poinstruowanie

Jestem w Javie bardzo świeży i marzeniem jest dostanie tylu odpowiedzi na pytanie, które może dotyczyć nawet czegoś innego - chciałbym, skoro już się uczę, uczyć się jak pisać dobrze. Co do *, mam pytanie (raczej naiwne): po modyfikacji

            catch(InputMismatchException ime)
            {
                so.println(" To nie jest liczba calkowita !");
                so.println(" Komunikat systemowy: " + ime);
                sc.next();
            }

sc.next() oznacza, że Scanner próbuje pobrać kolejny token (mam go rozumieć jako po prostu to, co będzie następnym inputem w kolejności, tzn. np. strong, double, int?). Nie przeszkadza nam to tutaj dlatego, że w catch nie pobieramy z wejścia nic od użytkownika? Pytam o to, bo wyobrażam sobie (dobre), że po wyrzuceniu tego komunikatu Scanner spróbuje pobrać token, który tam nie zostanie podany - nastąpi to dopiero po zapętleniu while'a, przy

number = sc.nextInt();

?
Przepraszam, jeśli załamię Was tym pytaniem

0

Nie rozumiem pytania, ale obsługa InputMismatchException jest zbędna:

do {
    System.out.println(" Podaj liczbe z przedzialu [0, 99]: ");
    if (sc.hasNextInt() /* uprzednie sprawdzenie, czy mamy kolejnego inta */) {
        number = sc.nextInt();
        valid = (number >= 0) && (number <= 99);
        if (!valid) {
            System.out.println(" Podano liczbe spoza zakresu !");
        }
    } else {
        System.out.println(" To nie jest liczba calkowita !");
        sc.next();
        valid = false;
    }
} while (!valid);

Nie wiem też, po co dekorujesz System.out PrintStreamem.

0

Dzięki Kerai, zrozumiałem! (chociaż pytanie sformułowałem chyba 'pokrętnie').

W powyższym kodzie za to sc.next() zwraca kolejny token, który okazał się nie być intem, "w przestrzeń" (?) po to, by sc.hasNextInt() miało sens, zgadza się?

0

Dzięki! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0