В вашем методе:
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
while ((i < 1) || (i > 5)) {
System.out.println("Invalid option, please select again");
i = scan.nextInt();
}
return i;
для ввода 0
читает элемент от 0
до i
, затем входит в цикл (потому что условие i<1
), затем печатает сообщение, затем пытается сканировать следующий элемент в цикле. Поскольку входной поток уже исчерпан
согласно документации Scanner # nextInt () :
Выдает:
NoSuchElementException - если ввод исчерпан
На мой взгляд, все в порядке (кроме ошибки в логике вашего метода).
----------
РЕДАКТИРОВАТЬ
----------
Допустимые значения должны быть от 1 до 4, оба включительно. Почему вход
поток исчерпан?
Я не знаю, почему вы не используете отладчик для проверки того, что происходит в вашем коде, просто нажмите на строку в правой панели в вашей IDE, чтобы установить точку останова, затем щелкните правой кнопкой мыши свой метод тестирования и выберите « отладка "из контекстного меню.
В любом случае, давайте отладим ваш метод для ввода 0
шаг за шагом на бумаге:
1 Scanner scan = new Scanner(System.in);
2 int i = scan.nextInt();
3 while ((i < 1) || (i > 5)) {
4 System.out.println("Invalid option, please select again");
5 i = scan.nextInt();
6 }
7 return i;
Входной буфер содержит один символ 0
.
- Поток выполнения перемещается в строку 2
- В строке 2 сканер считывает символ
0
из входного потока в переменную i
. Переменная i
теперь содержит значение 0
. После этого входной поток пуст (требуется)
- в строке 3 проверяется условие
((i < 1) || (i > 5))
. Поскольку i
равно 0
, условие выполняется, и поток программы входит в цикл
- в строке 4 сообщение выводится на консоль
- в строке 5 сканер пытается прочитать следующее целое число из входного буфера. Поскольку входной буфер исчерпан, генерируется исключение
Думаю, теперь все должно быть ясно. Почему входной поток исчерпан? Поскольку у него был только один элемент 0
, который был прочитан в строке 2, то в строке 5 он был пуст (исчерпан)
В вашем коде есть ошибка, но именно поэтому у нас есть модульный тест, чтобы найти такие ошибки).
Совет: используйте метод Scannes # hasNextInt , чтобы проверить, есть ли следующий int во входном потоке, чтобы избежать исключения.