Попытка написать метод, который проверяет пользовательский ввод в JAVA, получая NoSuchElementException

Я пытаюсь написать метод для обработки всего моего ввода от пользователя в консольном приложении. Я называю этот метод в общей сложности 5 раз. Первый раз состояние

а) число должно быть положительным и вещественным (двойным)

следующие 4 раза условие

б) число должно быть больше 1

Это мой метод:

private static double numChk(int errNum) {

    final String[] ERROR_MESSAGE = {
            "\nPlease enter only positive, real-valued numbers",
            "\nPlease enter only positive numbers greater than 1" };
    Scanner in = new Scanner(System.in);
    double tempData;

    while (!in.hasNextDouble()) {
        System.out.println(ERROR_MESSAGE[errNum]);
        System.out.print("  Please try again: ");
        in.next();
    }
    tempData = in.nextDouble();

    // in.close();
    return tempData;
}

это пример вызова этого метода:

 do {
        System.out
                .println("Please enter only positive, real-valued numbers");
        System.out.print("  Enter a constant: ");
        mu = numChk(0);
    } while (mu <= 0);

обратите внимание на "// in.close();" в методе, который я написал. Без закрытия сканера, этот метод работает нормально. Однако мое назначение требует, чтобы я закрыл все открытые входные потоки. если я закрою входной поток в методе и снова открою его, я получу NoSuchElementException. Я знаю, что мог бы просто поместить все это в мой основной метод и закрыть ввод в конце, однако, я хотел бы знать, есть ли способ сделать это (проверка ввода, несколько раз) и иметь возможность закрыть входной поток.

3 ответа

Когда вы вызываете in.close(), вы также закрываете System.in. В следующий раз, когда вы попытаетесь использовать новый сканер, он попытается использовать закрытый System.in, и поэтому вы получаете исключение, когда пытаетесь читать с него.

Смотрите: Использование Scanner.next() для ввода текста

Если вы вызываете in.close() в методе, вам нужно каким-то образом определить, является ли он последним вводом или нет.

Я бы порекомендовал поместить сканер в ваш основной метод, передать сканер в метод, а затем закрыть его, когда вы закончите со всеми вашими данными.

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

После цикла while он пытается вызвать, по этой линии не может быть никаких входов.

 tempData = in.nextDouble();
Другие вопросы по тегам