Почему приповторной итерации метод hasNextLine возвращает ложь?
Если кратко, то у меня в main методе есть бесконечный цикл. На первой итерации цикла все идёт нормально, но начиная со второй Scanner начинает вести себя не ожиданно.
Дальше фрагмент цикла.
while (true) {
int variable1 = 0;
int variable2 = 0;
String str = "";
do {
try (Scanner scan = new Scanner(System.in)) {
if (scan.hasNextLine()) {
System.out.print("Enter Value: ");
str = scan.nextLine();
}
}
} while (str.length() != 4);
А именно метод hasNextLine() возвращает ложь, из-за чего на второй итерации он не позволяет ввести данные с клавиатуры, а использует значение по-умолчанию, т.е. str = "";
2 вопроса: 1. Почему это происходит? 2. Как это исправить не прибегая к next() (так просто, на будущее).
Я так же нашёл похожий вопрос про ввод 2 чисел и операции и то, что nextLine() читает до первого \n из-за чего и происходит ввод пустой строки, только моя проблема вроде немного отличается
Ответы (1 шт):
Не совсем понятно, почему в вашем понимании сканер ведет себе неожиданно? Вы используете конструкцию try-with-resourses. В эту конструкцию передается сканер, в аргументах которого System.in, а System.in - системная переменная, возвращающая InputStream. Другими словами вы получаете InputStream из системной переменной, т.е. фактически вы его не открывали и программных средств для его открытия у вас нет. После первой итерации данный InputStream закрывается средствами конструкции try-with-resourses. Посему на второй итерации вы сделать не можете ровным счетом ничего: открыть самостоятельно данный поток вы не можете, а единственный поток ввода, открытый для вас системой, хранившийся в переменной System.in, вы закрыли на предыдущем шаге. Шах и мат. Мораль: нечего закрывать ресурсы, которые вы не открывали. Решение проблемы выглядит так:
Scanner scan = new Scanner(System.in);
while (true) {
int variable1 = 0;
int variable2 = 0;
String str = "";
do {
if (scan.hasNextLine()) {
System.out.print("Enter Value: ");
str = scan.nextLine();
}
} while (str.length() != 4);
}