Mam problem przy zapętlaniu Try Catch

0

Cześć

Piszę program w celu nauki programowania. Postanowiłem zrobić zabezpieczenie na wprowadzane dane (żeby nie wywaliło błędu jeżeli użytkownik nie poda liczby tylko string). Po zrobieniu pętli w której umieściłem try catch, w przypadku wystąpienia wyjątku program zapętla się w nieskończoność, pomimo że moim zdaniem powinien na nowo dać możliwość wprowadzenia danych. Co prawda przy szukaniu znalazłem już dużo prostsze zabezpienienie czyli hasnextint ale nie daje mi spokoju dlaczego ta pętla nie działa tak jak oczekuje.

1   public int poziomTrudnosci()
2    {
3        int ileCyfrowaLiczba = 0;
4        boolean zabezpieczenieInt = true;
5        Scanner scan = new Scanner(System.in);
6       do {
7           try {
8               ileCyfrowaLiczba = scan.nextInt();
9               if (ileCyfrowaLiczba >1 && ileCyfrowaLiczba <5)
10               zabezpieczenieInt = false;
11               else{
12                   System.out.println("Podałeś liczbę ze złego zakresu (Przypominam że zakres to od 2 do 4. Spróbój jeszcze raz.");
13               }
14                }catch (Exception e){
15               System.out.println("Nie podałeś liczby całkowitej. Spróbój jeszcze raz");
16               zabezpieczenieInt = false;
17           }
18            }while (zabezpieczenieInt);
19       return ileCyfrowaLiczba;

Jak uruchomię program to jeżeli użytkownik poda liczbę z przedziału 2-4 to działa prawidłowo, Jak poda inną liczbę również działa prawidłowo (wykonuje pętle jeszcze raz) natomiast jak podam stringa jakiegoś to powtarza w nieskończoność komunikat z wiersza 15 zamiast wyświetlić go raz i wrócić do wiersza 6?

1

z javadoca:
Scans the next token of the input as an int. This method will throw InputMismatchException if the next token cannot be translated into a valid int value as described below. If the translation is successful, the scanner advances past the input that matched.

Z doca wynika, że translacja do inta się nie udała więc skaner się nie przesunął. Kolejna iteracja pętli próbuje skonwertować tego samego stringa.

Protip:
Pisz kod po angielsku

3

Zamiast wyjątków spróbuj użyć hasNextInt.
A po wykryciu błędów spróbuj wywołać nextLine()
Nie testowałem.

0

JecekPs - Dzięki za odpowiedź, teraz już wiem dlaczego mi to nie działa, myślałem że inaczej działa skaner :)

vpiotr - Pisałem w poście że znalazłem tę funkcję i działa :P ale chciałem wiedzieć dlaczego tam się wysypywał program:)

1

Powinieneś w catch dać zabezpieczenieint = true i scan.nextLine()

catch (Exception e){
  System.out.println("Nie podałeś liczby całkowitej. Spróbój jeszcze raz");
  zabezpieczenieInt = true;
  scan.nextLine();
}

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