Не понять как работает Scanner в моём коде
Есть код
public static int printInt() {
Scanner print = new Scanner(System.in);
try {
return print.nextInt();
} catch (InputMismatchException e) {
System.out.println("Введено не число!\nВведите повторно:");
return printInt();
}
}
Когда введено не число, код из блока catch
выполняется много раз, пока не заполнится стек и не возникнет ошибка переполнения стека.
Не могу понять, почему Scanner
берет значение, которое консоль сама же вывела, и не даёт возможности ввести число.
У меня есть решение, но мне не нравится, что там используется ненужная переменная.
public static int printInt() {
Scanner print = new Scanner(System.in);
try {
return print.nextInt();
} catch (InputMismatchException e) {
System.out.println("Введено не число!\nВведите повторно:");
String t = print.nextLine(); // ненужная переменная
return printInt();
}
}
И подскажите решение, не использующее ненужные переменные.
Ответы (1 шт):
Если нужно как-то обработать некорректные данные, оставшиеся в потоке ввода/сканере после предыдущей попытки чтения целого числа print.nextInt
, достаточно было бы прочитать их при помощи print.next()
, не сохраняя в отдельную переменную:
public static int printInt(){
Scanner print = new Scanner(System.in);
try {
return print.nextInt();
} catch (InputMismatchException e) {
System.out.println("Введено не число, длина некорректного ввода: "
+ print.next().length() + "\nВведите повторно:");
return printInt();
}
}
Также имело бы смысл проверять наличие требуемого типа данных в потоке ввода / сканере, а не ловить исключение:
public static int printInt(){
Scanner print = new Scanner(System.in);
if (print.hasNextInt()) {
return print.nextInt();
}
System.out.println("Введено не число!\nВведите повторно. Длина неверного ввода: " + print.next().length());
return printInt();
}