Ошибка в цикле while.Это не остановит Java - PullRequest
2 голосов
/ 09 апреля 2011

Эй, ребята, у меня есть следующий цикл while, который, кажется, не останавливается. Это должно попросить пользователя в течение часа. Я пытаюсь поймать событие, когда пользователь не вводит номер.

т.е. Введите час: foo Вы не ввели правильное значение

Затем он должен позволить пользователю снова ввести значение в течение часа, но он продолжает печатать сообщение об ошибке снова и снова

    private static void setTime(Clock clock){
        int hours = -1;
        int minutes = -1;
        int seconds = -1;

        Scanner scanner = new Scanner(System.in);

        while(true)
        {
            try{
                System.out.print("Enter hours: ");
                hours = scanner.nextInt();          
            }
            catch(NumberFormatException nfe){
                System.out.println("Input was not an integer, please try again");
                continue;
            }
            catch(InputMismatchException ims){
                System.out.println("Input was not an integer, please try again");
                continue;
            }
            break;
        }
}

Ответы [ 5 ]

4 голосов
/ 09 апреля 2011

Переместите Scanner scanner = ... в цикл while.

2 голосов
/ 09 апреля 2011

Из документации:

Когда сканер выбрасывает InputMismatchException, сканер не передаст токен, вызвавший исключение, так что это может быть извлекается или пропускается через некоторые другие способ.

Вы должны прочитать неправильный ответ перед перезапуском цикла, иначе он будет читать одно и то же снова и снова.

И согласно документации nextInt() никогда не возвращайте NumberFormatException, поэтому нет необходимости проверять его.

Вы также можете использовать hasNextInt() так:

while(true) {
    if(scanner.hasNextInt()) {
        hours = scanner.nextInt();
        break;
    } else {
        scanner.next();
        System.out.println("You must enter an integer");
    }
}
1 голос
/ 09 апреля 2011

Это потому, что scanner.nextInt () переходит к следующему токену ТОЛЬКО в случае успешного анализа (см. Javadoc).

1 голос
/ 09 апреля 2011

Вы пытались сначала прочитать со сканера как строку, а затем пытались разобрать ее как целое число?

, например

String line = scanner.nextLine();
hours = Integer.parseInt(line);
1 голос
/ 09 апреля 2011

Вы можете добавить scanner.nextLine(); после печати исключения.

Чтобы быть ясным:

try{
                System.out.print("Enter hours: ");

                hours = scanner.nextInt();          
            }
            catch(NumberFormatException nfe){
                System.out.println("Input was not an integer, please try again");
                scanner.nextLine();
                continue;
            }
            catch(InputMismatchException ims){
                System.out.println("I--nput was not an integer, please try again");
                scanner.nextLine();
                continue;
            }
            break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...