Сканер продолжает пропускать ввод, используя nextInt() и циклы

Я использую цикл while, чтобы убедиться, что значение, введенное в объект сканера, является целым числом как таковым:

while (!capacityCheck) {
        try {
            System.out.println("Capacity");
            capacity = scan.nextInt();
            capacityCheck = true;
        } catch (InputMismatchException e) {
            System.out.println("Capacity must be an integer");
        }
    }

однако, если пользователь не вводит целое число, когда он должен вернуться и ввести другой ввод, он просто повторно печатает «Емкость», за которым следует вывод в улове, не запрашивая дополнительных вводов. Как мне остановить это?


person Matt    schedule 20.03.2013    source источник


Ответы (5)


scan.nextLine();

Поместите этот фрагмент кода в свой блок catch, чтобы использовать нецелочисленный символ вместе с символом новой строки, который остается в буфере (следовательно, бесконечная печать системного вывода), в случае, если вы дали неверный ввод.

Конечно, есть и другие более чистые способы добиться того, чего вы хотите, но я предполагаю, что это потребует некоторого рефакторинга вашего кода.

person RainMaker    schedule 20.03.2013
comment
Зачем ставить scan.nextLine();? - person Bhesh Gurung; 20.03.2013
comment
scan.nextInt() будет сканировать только следующее целое число, но когда это неправильный ввод, введенный недопустимый символ остается там, не потребляясь, и, следовательно, заставляет while переходить в бесконечный цикл. Обновил мой ответ! :) - person RainMaker; 20.03.2013

Используйте следующее:

while (!capacityCheck) {
        System.out.println("Capacity");
        String input = scan.nextLine();
        try {
            capacity = Integer.parseInt(input );
            capacityCheck = true;
        } catch (NumberFormatException e) {
            System.out.println("Capacity must be an integer");
        }
    }
person BobTheBuilder    schedule 20.03.2013

Попробуй это :

while (!capacityCheck) {
    try {
        System.out.println("Capacity");
        capacity = scan.nextInt();
        capacityCheck = true;
    } catch (InputMismatchException e) {
        System.out.println("Capacity must be an integer");
        scan.nextLine();
    }
}
person Kim Honoridez    schedule 20.03.2013

Попробуйте поместить это в конец цикла -

scan.nextLine();

Или лучше поместить его в блок захвата.

    while (!capacityCheck) {
        try {
            System.out.println("Capacity");
            capacity = scan.nextInt();
            capacityCheck = true;
        } catch (InputMismatchException e) {
            System.out.println("Capacity must be an integer");
            scan.nextLine();
        }
    }
person Sudhanshu Umalkar    schedule 20.03.2013
comment
Он должен потреблять символ новой строки. - person Sudhanshu Umalkar; 20.03.2013

Я не вижу необходимости в try/catch или capacityCheck, поскольку у нас есть доступ к методу hasNextInt(), который проверяет, является ли следующий токен целочисленным. Например, это должно делать то, что вы хотите:

    while (!scan.hasNextInt()) { //as long as the next is not a int - say you need to input an int and move forward to the next token.
        System.out.println("Capacity must be an integer");
        scan.next();
    }
    capacity = scan.nextInt(); //scan.hasNextInt() returned true in the while-clause so this will be valid.
person ddmps    schedule 20.03.2013