Zapętlenie sprawdzania wystąpienia wyjątku w Javie

Zapętlenie sprawdzania wystąpienia wyjątku w Javie
madzieq
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 83
0

Witam.
Usiłuję stworzyć fragment programu, który prosi użytkownika o liczbę.
W przypadku wprowadzenia liczby program powinien zakończyć działanie - w przypadku wprowadzenia błędnej wartości (np. litery) powinien wyświetlić komunikat "Wprowadzoną niepoprawną liczbę. Spróbuj ponownie" i poprosić o kolejne wprowadzenie liczby - aż do skutku, aż do momentu kiedy wprowadzona dana będzie liczbą.

Kopiuj
        Scanner odczyt = new Scanner(System.in);
        
        int licznik = 0;
        int ilosc;
        
        System.out.println("Podaj liczbę danych");
        
        while(licznik != 1)
        {
            try {
                ilosc = odczyt.nextInt();
                licznik++;
            }
            catch (Exception e){
                System.out.println("Wprowadzoną niepoprawną liczbę. Spróbuj ponownie");
            }
            finally {}
            
            if (licznik==1) break;
        }

Jeżeli użytkownik wprowadzi liczbę - jest ok. Program kończy działanie. Jeśli jednak wprowadzi np. literę, program się zapętla wypisując komunikat "Wprowadzoną niepoprawną liczbę. Spróbuj ponownie" bez końca. Szczerze nie wiem skąd to zapętlenie.
Jak poprawić ten program, aby użytkownik musiał wpisywać daną aż do momentu poprawnego wprowadzenia liczby?

pozdrawiam :)

K1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 35
1
Kopiuj
        Scanner odczyt;
 
        int licznik = 0;
        int ilosc;
        
        do
        {
           odczyt = new Scanner(System.in);
           System.out.println("Podaj liczbę danych");
            try {
                ilosc = odczyt.nextInt();
                licznik++;
            }
            catch (Exception e){
                System.out.println("Wprowadzoną niepoprawną liczbę. Spróbuj ponownie");
            }
            finally {}
 
            //if (licznik==1) break;
        } while(licznik !=1);

Poprawiłem tak na szybko.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
2

Nie podoba mi się wielokrotne tworzenie obiektu typu Scanner. Przyczyną zapętlenia jest to, że metoda nextInt() próbuje odczytać liczbę - ponieważ nie ma liczby, to niczego nie czyta, w buforze klawiatury zostaje błędny tekst. I on jest czytany w nieskończoność. Są dwa rozwiązania:

Kopiuj
        do
        {           
           System.out.println("Podaj liczbę danych");
            try {
                ilosc = odczyt.nextInt();
                licznik++;
            }
            catch (Exception e){
                System.out.println("Wprowadzoną niepoprawną liczbę. Spróbuj ponownie");
                odczyt.nextLine(); //wyczyszczenie bufora
            }
            finally {}
 
        } while(licznik !=1);
//...
        do
        {           
           System.out.println("Podaj liczbę danych");
            try {
                ilosc = Integer.parseInt(odczyt.nextLine()); //czytanie całej linii razem z Enterem
                licznik++;
            }
            catch (Exception e){
                System.out.println("Wprowadzoną niepoprawną liczbę. Spróbuj ponownie");
            }
            finally {}
 
        } while(licznik !=1);

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.