Одной из первых вещей, которые я делаю на новой машине, является перекарта Caps Lock к новому Управлению.
Google вокруг, существует много из .reg
файлы, доступные, который сделает это безболезненно для Вас в Windows.
В вашем последнем блоке else
вам необходимо очистить ' w 'или другой неверный ввод со сканера. Вы можете сделать это, вызвав next ()
на сканере и проигнорировав возвращаемое значение, чтобы отбросить этот недопустимый ввод, как показано ниже:
else
{
System.out.println("You have entered an invalid input. Try again.");
in.next();
}
Флаговые переменные слишком подвержены ошибкам для использования. Вместо этого используйте явное управление циклом с комментариями. Кроме того, 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);
Проблема заключалась в том, что вы не продвинули Сканер
за проблемный ввод. Из документации 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