try catch do while - problem z obsługą wyjątku i zapętleniem

0

Mam problem z poniższym kodem. Próbuję zapętlić try catch tak, aby po wpisaniu złych danych wszystko powtarzało się w pętli. I myślałem, że sprawdzi się ** .next();**. Problem pojawia się jednak, gdy użytkownik wpisze np."aa 3d sf " <-- wtedy pętla przeskakuje automatycznie 3 razy. Albo, jeśli wprowadzi "we wefg 32", to wtedy w 3 przebiegu (automatycznym) wczyta ostatnią wartość, ponieważ jest tam liczba i uzna, że został podany wiek. Co powinienem zrobić, żeby usunąć powyższe problemy.

public void setAge(){
        Scanner scanX = new Scanner(System.in);
        int setAge;
        boolean newError = false;


        do {
            System.out.println("Set Age: ");

            try {
                setAge = scanX.nextInt();
                this.age = setAge;
                newError = true;

            } catch (RuntimeException e) {
                System.out.println("Wrong input data. You have to write your age using digits only");
                scanX.next();
            }
        } while(!newError);
    }
2

Dlaczego normalną funkcjonalność opierasz na wyjątkach? Uzasadnisz to?

0

Jeśli wprowadzałem przypadkowy ciąg znaków, lub ciąg cyfr ze spacjami, to wyrzucało mi błędy. Dlatego chciałem dać to w try catch i dalej w pętlę. Może źle podszedłem do sprawy. Jeśli da się to uprościć lub zrobić jakoś inaczej to chętnie skorzystam.

2

Ogólnie to słaby jestem w Java :) ale może zrób chociaż tak, że będziesz wczytywał stringa - sprawdzal czy to liczba (ew, jakies rzutowanie itp) i dzialal sobie dalej bez wyjatkow. Ogólnie sytuacja, która opisujesz nie jest jakoś "wyjątkowa", a co za tym idzie, osobiście nie stosowałbym ich.

1

Scanner dzieli ci wpisany tekst po spacji (domyślnie). Można to zmienić metodą setDelimeter:

A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace. The resulting tokens may then be converted into values of different types using the various next methods.

Proponuję użyć metody nextLine, która ci zwróci nie tokena, a całą linie i otrzymanego Stringa zparsować na inta

1

Może to wybróbuj:

Scanner scan = new Scanner(System.in);
   
while(!scan.hasNextInt()){
  scan.nextLine();
}
    
int value = scan.nextInt();
System.out.println("INPUT " + value);   	
0

@cs Dzięki za pomoc. Tak jest łatwiej i krócej... I działa :-)
@Tyvrel - to co piszesz też będę musiał wkomponować, dzięki.

P.S.
Zastanawia mnie tylko jedna rzecz. Po uruchomieniu metody, przy pierwszym przebiegu pętli nie uruchamia mi się System.out.println("Set Age: test2"); Można zrobić to tak, żeby uruchamiało się od razu i żeby Set Age: test1 był niepotrzebny?

   public void setAge() {
        Scanner scanX = new Scanner(System.in); 
        System.out.println("Set Age: test1");
        while (!scanX.hasNextInt()) {
            System.out.println("Set Age: test2");
            scanX.nextLine();
        }
        this.age = scanX.nextInt();
    }

Jak próbuję zrobić to w pętli do...while pojawia się inny problem. Gdy wpiszę dane trzeba wpisać je drugi raz, żeby zaakaceptowało. I test2 wyświetla się dopiero po pierwszym wpisaniu danych.

    public void setAge() {
        Scanner scanX = new Scanner(System.in); 
        do {
            System.out.println("Set Age: ");
            scanX.nextLine();
            System.out.println("Set Age: test2");
        } while (!scanX.hasNextInt());
        this.age = scanX.nextInt();
    }
1

Ładne to nie jest, ale masz:):

public void setAge() {
    Scanner scanX = new Scanner(System.in);
    while (true) {
      System.out.println("Set Age: test2");
      if (scanX.hasNextInt()){
        break;
      }
      scanX.nextLine();
    }
    this.age = scanX.nextInt();
  }
0

Mi się podoba :-D

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