Почему приповторной итерации метод hasNextLine возвращает ложь?

Рейтинг: -1Ответов: 1Опубликовано: 22.01.2023

Если кратко, то у меня в 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 из-за чего и происходит ввод пустой строки, только моя проблема вроде немного отличается

Ответы

▲ 3Принят

Не совсем понятно, почему в вашем понимании сканер ведет себе неожиданно? Вы используете конструкцию 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);
}