Попытка написать метод, который проверяет пользовательский ввод в 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, и поэтому вы получаете исключение, когда пытаетесь читать с него.
Если вы вызываете in.close() в методе, вам нужно каким-то образом определить, является ли он последним вводом или нет.
Я бы порекомендовал поместить сканер в ваш основной метод, передать сканер в метод, а затем закрыть его, когда вы закончите со всеми вашими данными.
Я подозреваю, что происходит, вы отправляете входные данные, как будто из файла. Первый сканер буферизирует все входные данные, и когда вы закрываете и снова открываете его, вы теряете данные, которые были буферизованы на первом сканере. Я не могу этого гарантировать, но вот как это выглядит.
После цикла while он пытается вызвать, по этой линии не может быть никаких входов.
tempData = in.nextDouble();