Вы можете использовать один из многих hasNext*
методов, которые Scanner
имеет для предварительной проверки.
if (in.hasNextInt()) {
int a = in.nextInt() ;
System.out.println(a);
} else {
System.out.println("Sorry, couldn't understand you!");
}
Это предотвращает даже выброс InputMismatchException
, потому что вы всегда убедитесь, что он БУДЕТ совпадать перед прочтением.
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()
равен true, 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