Java: Бесконечный цикл с помощью Сканера in.hasNextInt ()

Одной из первых вещей, которые я делаю на новой машине, является перекарта Caps Lock к новому Управлению.

Google вокруг, существует много из .reg файлы, доступные, который сделает это безболезненно для Вас в Windows.

15
задан Pshemo 20 May 2016 в 12:30
поделиться

3 ответа

В вашем последнем блоке else вам необходимо очистить ' w 'или другой неверный ввод со сканера. Вы можете сделать это, вызвав next () на сканере и проигнорировав возвращаемое значение, чтобы отбросить этот недопустимый ввод, как показано ниже:

else
{
      System.out.println("You have entered an invalid input. Try again.");
      in.next();
}
18
ответ дан 1 December 2019 в 01:45
поделиться

Флаговые переменные слишком подвержены ошибкам для использования. Вместо этого используйте явное управление циклом с комментариями. Кроме того, hasNextInt () не блокируется. Это неблокирующая проверка, чтобы увидеть, может ли вызов future next получить ввод без блокировки. Если вы хотите заблокировать, используйте метод nextInt () .

// Scanner that will read the integer
final Scanner in = new Scanner(System.in);
int inputInt;
do {  // Loop until we have correct input
    System.out.print("Specify an integer between 0 and 5: ");
    try {
        inputInt = in.nextInt(); // Blocks for user input
        if (inputInt >= 0 && inputInt <= 5)  { 
            break;    // Got valid input, stop looping
        } else {
            System.out.println("You have not entered a number between 0 and 5. Try again.");
            continue; // restart loop, wrong number
         }
    } catch (final InputMismatchException e) {
        System.out.println("You have entered an invalid input. Try again.");
        in.next();    // discard non-int input
        continue;     // restart loop, didn't get an integer input
    }
} while (true);
1
ответ дан 1 December 2019 в 01:45
поделиться

Проблема заключалась в том, что вы не продвинули Сканер за проблемный ввод. Из документации hasNextInt () :

Возвращает true , если следующий токен на входе этого сканера может быть интерпретирован как значение int в системе счисления по умолчанию с использованием метод nextInt () . Сканер не проходит мимо любого ввода.

Это верно для всех методов hasNextXXX () : они возвращают истину или ложь без продвижения сканера .

Вот отрывок, иллюстрирующий проблему:

    String input = "1 2 3 oops 4 5 6";
    Scanner sc = new Scanner(input);
    while (sc.hasNext()) {
        if (sc.hasNextInt()) {
            int num = sc.nextInt();
            System.out.println("Got " + num);
        } else {
            System.out.println("int, please!");
            //sc.next(); // uncomment to fix!
        }
    }

Вы обнаружите, что эта программа войдет в бесконечный цикл, спрашивая int, пожалуйста! неоднократно.

Если вы раскомментируете оператор sc.next () , то он заставит Scanner пройти мимо ошибочного токена hasNextInt () . Затем программа напечатает:

Got 1
Got 2
Got 3
int, please!
Got 4
Got 5
Got 6

Тот факт, что неудачная проверка hasNextXXX () не пропускает ввод, является преднамеренным: это позволяет вам выполнить дополнительные проверки этого токена, если это необходимо. Вот пример для иллюстрации:

    String input = " 1 true foo 2 false bar 3 ";
    Scanner sc = new Scanner(input);
    while (sc.hasNext()) {
        if (sc.hasNextInt()) {
            System.out.println("(int) " + sc.nextInt());
        } else if (sc.hasNextBoolean()) {
            System.out.println("(boolean) " + sc.nextBoolean());
        } else {
            System.out.println(sc.next());
        }
    }

Если вы запустите эту программу, она выдаст следующее:

(int) 1
(boolean) true
foo
(int) 2
(boolean) false
bar
(int) 3
10
ответ дан 1 December 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: