Метод nextInt () класса Scanner не запрашивает у меня ввод снова в цикле while? - PullRequest
0 голосов
/ 11 ноября 2018

В моем основном методе этот код:

int hours = getHours();

Вот код получения часов ():

public static int getHours() {

    int hours = 0;
    boolean hoursNotOk = true;

    do {
    try {
        hours = console.nextInt();
        hoursNotOk = false;

    }catch(Exception e) {
        System.out.print(e);



    }finally {
        if(hoursNotOk) {
            System.out.print(", please re-enter the hours again:");

        }else {
            System.out.print("**hours input accepted**");
        }
    }
    }while(hoursNotOk);


    return hours;
}

Впервые console.nextInt () запросит у меня ввод, поэтому допустим, что я вставил в консоль «два», он сгенерирует исключение и снова выполнит цикл try, но на этот раз он не спрашивал меня для ввода и продолжает печатать из ловушки и, наконец, блокировать, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Более простой подход - проверить, можете ли вы прочитать int, прежде чем выдать исключение. В любом случае вам нужно отменить текущее слово или строку перед повторной попыткой.

public static int getHours() {
    while (true) {
        if (console.hasNextInt()) {
            System.out.print("**hours input accepted**");
            return console.nextInt();
        }
        console.nextLine(); // discard the line and try again
        System.out.print(", please re-enter the hours again:");
    }
}
0 голосов
/ 11 ноября 2018

Поскольку nextInt() читает только число, а не \n, добавленное после нажатия клавиши возврата, вам необходимо очистить его, прежде чем вы сможете снова прочитать число, в этом примере я делаю nextLine() в catch блок. вот более глубокое объяснение

Рабочий пример:

public static int getHours() {
    int hours = 0;
    boolean hoursNotOk = true;

    do {
        try {
            System.out.println("Here");
            hours = console.nextInt();
            hoursNotOk = false;

        } catch (Exception e) {
            e.printStackTrace();
            console.nextLine();
        } finally {
            if (hoursNotOk) {
                System.out.println(", please re-enter the hours again:");

            } else {
                System.out.println("**hours input accepted**");

            }
        }
    } while (hoursNotOk);

    return hours;
}
...