При попытке прочитать значение с клавиатуры происходит java.util.NoSuchElementException

198
25 августа 2021, 14:30

Выполняю следующий код:

package ru.itsjava.algorythmes;
import java.util.Scanner;
public class test {
    public static void main(String[] args) {
        int a = reader();
        int b = reader();
    }
    public static int reader(){
        System.out.print("Enter the number: ");
        Scanner scan = new Scanner(System.in);
        int value = scan.nextInt();
        scan.close();
        return value;
    }
}

Во время выполнения он читает клавиатуру и присваивает первой переменной значение. Но при повторном вызове reader() происходит ошибка. При этом исключение NoSuchElementException не передаёт сообщений (нет двоеточия с каким-то комментарием). По-идее переменная scan должна существовать только внутри reader() и исчезать после завершения метода. Так что для меня не совсем очевидно почему при повторном вызове метода происходит исключение. Помогите пожалуйста разобраться. Просто интересно что происходит именно в таком случае.

Answer 1

@Red Circle, для меня тоже странно, но в вашем случае именно scan.close(); является причиной исключения. Закомментируйте и все работает нормально. Я могу вам предложить проверенный в работе и удобный метод получения целых чисел в заданном диапазоне из консоли:

public static int readerIntFromInterval(int a, int b) {
    Scanner scan = new Scanner(System.in);
    int userInput;
    while (true) {
        System.out.print("Введите целое "
                + "число в диапазоне [" + a + " .. " + b + "]: ");
        if (scan.hasNextInt()) {
            userInput = scan.nextInt();
            if (userInput >= a && userInput <= b) break;
            else
                System.out.println("Не соответствует условиям ввода! ");
        } else {
            System.out.println("Не соответствует условиям ввода! ");
            scan.nextLine();
        }
    }
    scan.close();
    System.out.println("Введено число: " + userInput);
    return userInput;
}

И хотя здесь тоже присутствует scan.close(), но код работает исправно.

READ ALSO
Нужно найти в строке множество букв

Нужно найти в строке множество букв

есть строка "kldm" и в ней нужно проверить, есть ли буквы из "l,p,o,k,j,s,h,r", думаю реализоватьcontains, но как сделать, чтобы он не 1 букву искал, и не слово,...

147
Как сделать фильтр текста по регулярному выражения передаваемому как аргумент?

Как сделать фильтр текста по регулярному выражения передаваемому как аргумент?

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

115
Как реализовать группировку и расчет среднего на основании информации из HashSet?

Как реализовать группировку и расчет среднего на основании информации из HashSet?

Необходимо реализовать метод, который будет рассчитывать среднюю зарплату среди всех сотрудников; выводить список подразделений и среднюю...

231
Некоторые странные моменты связанные с потребностью сделать Нисходящее Приведение (Java)

Некоторые странные моменты связанные с потребностью сделать Нисходящее Приведение (Java)

Мой вопрос написал ниже в комментах программы с достаточно подробным описанием причины возникновения собственно самого вопроса

201