Mam problem przy zapętlaniu Try Catch

Mam problem przy zapętlaniu Try Catch
AN
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad rok
  • Postów:18
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.

Kopiuj
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?

edytowany 1x, ostatnio: Andzelm
JP
  • Rejestracja:prawie 6 lat
  • Ostatnio:około rok
  • Postów:24
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

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
3

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

AN
  • Rejestracja:prawie 3 lata
  • Ostatnio:ponad rok
  • Postów:18
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:)

gk1982
  • Rejestracja:prawie 14 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Łódź
  • Postów:541
1

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

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

Don't give up learning JavaScript!
It is enjoyable to make things visible which are invisible.
Każdy programista przybywający z innego miasta jest fachowcem.
Anyone who stops learning is old, whether at twenty or eighty.
Anyone who keeps learning stays young.
The greatest thing in life is to keep your mind young.

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.