Ответ 1
Вы можете использовать один из многих методов hasNext*
, которые Scanner
имеет для предварительной проверки.
if (in.hasNextInt()) {
int a = in.nextInt() ;
System.out.println(a);
} else {
System.out.println("Sorry, couldn't understand you!");
}
Это предотвращает даже отбрасывание InputMismatchException
, потому что вы всегда убедитесь, что оно будет соответствовать, прежде чем вы его прочитаете.
java.util.Scanner API
-
boolean hasNextInt()
: Возвращаетtrue
, если следующий токен в этом входе сканера может быть интерпретирован как значение int в базе данных по умолчанию с использованием методаnextInt()
. Сканер не продвигается через какой-либо вход. -
String nextLine()
: Адаптирует этот сканер к текущей строке и возвращает пропущенный вход.
Имейте в виду разделы, выделенные жирным шрифтом. hasNextInt()
не проходит мимо ввода. Если он возвращает true
, вы можете продвинуть сканер, вызвав nextInt()
, который не будет бросать InputMismatchException
.
Если он возвращает false
, вам нужно пропустить "мусор". Самый простой способ сделать это - просто вызвать nextLine()
, возможно, дважды, но хотя бы один раз.
Зачем вам нужно выполнить nextLine()
два раза: предположим, что это введенный ввод:
42[enter]
too many![enter]
0[enter]
Скажем, сканер находится в начале этого ввода.
-
hasNextInt()
истинно,nextInt()
возвращает42
; сканер теперь находится непосредственно перед первым[enter]
. -
hasNextInt()
false,nextLine()
возвращает пустую строку, второйnextLine()
возвращает"too many!"
; сканер теперь сразу после второго[enter]
. -
hasNextInt()
истинно,nextInt()
возвращает0
; сканер теперь находится непосредственно перед третьим[enter]
.
Вот пример объединения некоторых из этих вещей. Вы можете поэкспериментировать с ним, чтобы изучить, как работает Scanner
.
Scanner in = new Scanner (System.in) ;
System.out.println("Age?");
while (!in.hasNextInt()) {
in.next(); // What happens if you use nextLine() instead?
}
int age = in.nextInt();
in.nextLine(); // What happens if you remove this statement?
System.out.println("Name?");
String name = in.nextLine();
System.out.format("[%s] is %d years old", name, age);
Скажем, что вход:
He is probably close to 100 now...[enter]
Elvis, of course[enter]
Тогда последняя строка вывода:
[Elvis, of course] is 100 years old