Не понять как работает 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 шт):

Автор решения: Nowhere Man

Если нужно как-то обработать некорректные данные, оставшиеся в потоке ввода/сканере после предыдущей попытки чтения целого числа 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();
}    
→ Ссылка