NoSuchElementException, когда метод вызывается после запуска кода выше

Когда я запускаю свой код, он будет работать нормально до строки «scanner.close ()». После этого, когда я запускаю метод "SumTenNumbers()"... он запустит первую строку цикла while один раз и вылетит с "NoSuchElementException"... Когда я удаляю код над строкой, вызывающей метод, он работает нормально... Почему это происходит, и как я могу решить эту проблему?

Это код:

public class Main
{

    public static void main(String[] args)
    {
        // we use the class "scanner" for input data
        Scanner scanner = new Scanner(System.in); //System.in allows you to type input data into the console which can be returned into the console
        System.out.println("Enter your name: ");
        String name = scanner.nextLine();
        System.out.println("Your name is " + name);

        System.out.println("Enter your year of birth: ");
        boolean isInt = scanner.hasNextInt();
        if (isInt)
        {
            int yearOfBirth = scanner.nextInt();

            int age = 2019 - yearOfBirth;
            if (age >= 0 && age <= 120)
            {
                System.out.println("You are " + age + " years old");
            }
            else
            {
                System.out.println("Invalid year of birth");
            }
        }
        else
        {
            System.out.println("Unable to parse year of birth");
        }
        scanner.close(); // we must close scanner


        SumTenNumbers();



    }

    public static void SumTenNumbers()
    {
        var reader = new Scanner(System.in);

        int sum = 0;
        int count = 1;

        while (count < 11)
        {
            System.out.println("Enter number " + count + ": ");
            boolean valid = reader.hasNextInt();
            if (valid)
            {
                int userNum = reader.nextInt();
                sum += userNum;
                count++;
            }
            else
            {
                reader.next();
                System.out.println("INVALID");
            }
        }

        System.out.println(sum);

        reader.close();
    }
}

Вот как это выглядит, когда я запускаю код...

Enter your name: 
Siddharth
Your name is Siddharth
Enter your year of birth: 
2001
You are 18 years old
Enter number 1: 
Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:937)
    at java.base/java.util.Scanner.next(Scanner.java:1478)
    at com.company.Main.SumTenNumbers(Main.java:64)
    at com.company.Main.main(Main.java:39)

Process finished with exit code 1

"мы должны закрыть сканер" почему вы так думаете?

Andy Turner 27.05.2019 17:24

Итак, в вашем случае поместите закрытие после SumTenNumbers, удалите новое и закройте из SumTenNumbers, сделайте общедоступным static void SumTenNumbers (считыватель сканера) и вызовите SumTenNumbers (сканер);

Jeremy Kahan 27.05.2019 17:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

строка reader.close() замыкает Scanner, а вместе с ней и System.in.

После этого вы больше не сможете читать из stdin (System.in).

Для предотвращения этого вы можете:

  • используйте только один объект Scanner и закройте его после последнего использования

  • закрыть System.in после использования в последний раз (используя Scanner или System.in.close())

  • закрыть System.in в конце вашей программы

  • никогда не закрывайте System.in (Проблема: другие процессы не могут использовать ресурс, stdin также может быть файлом, сетевым подключением или чем-то еще)

я понимаю. Спасибо! Я реализую это в своем коде

Siddharth Chaudhary 27.05.2019 18:44

Другие вопросы по теме