Проблема со сканером

У меня есть код, который я пытался запустить. Это дает мне исключение NoSuchElementException.

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Student {
    public static void main(String[] args) {
        System.out.println("Insert Names:");
        List<String> names = getNames();
        System.out.println("Insert Marks:");
        List<Integer> marks = getMarks();
        for (int i = 0; i < names.size(); i++) {
            String name = names.get(i);
            int mark = marks.get(i);
            System.out.println( name + " - " + mark);
        }
    }

    private static List<String> getNames() {
        List<String> names= new ArrayList<>();
        Scanner scanner = new Scanner( System.in );
        for ( int i = 0 ; i < 3; i++){
            names.add(scanner.nextLine());
        }
        scanner.close();
        return names;
    }

    private static List<Integer> getMarks() {
        List<Integer> names= new ArrayList<>();
        Scanner scanner = new Scanner( System.in );
        for ( int i = 0 ; i < 3; i++){
            names.add(scanner.nextInt());
        }
        scanner.close();
        return names;
    }
}

Эта ошибка возникает сразу после того, как я прочитал имена. Почему может возникнуть ошибка.

Возможный дубликат java.util.NoSuchElementException - Сканер читает пользовательский ввод

George Z. 13.05.2019 19:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ваш сканер принимает System.in в качестве входного потока. Когда вызывается scan.close(), он закрывает как ваш сканер, так и входной поток. Потоки, которые закрыты, не могут быть повторно открыты.

Если вы хотите закрыть свой сканер, вы можете создать один сканер в своем основном методе, который вы можете закрыть позже. Это может быть передано в качестве параметра вашим двум другим методам.

Вы можете назвать свой код так

public static void main(String[] args) {
    Scanner scanner = new Scanner( System.in );
    System.out.println("Insert Names:");
    List<String> names = getNames( scanner );
    System.out.println("Insert Marks:");
    List<Integer> marks = getMarks( scanner );
    for (int i = 0; i < names.size(); i++) {
        String name = names.get(i);
        int mark = marks.get(i);
        System.out.println( name + " - " + mark);
    }
    scanner.close();
}

private static List<String> getNames(Scanner scanner) {
    List<String> names= new ArrayList<>();
    for ( int i = 0 ; i < 3; i++){
        names.add(scanner.nextLine());
    }
    return names;
}

private static List<Integer> getMarks( Scanner scanner) {
    List<Integer> names= new ArrayList<>();
    for ( int i = 0 ; i < 3; i++){
        names.add(scanner.nextInt());
    }
    return names;
}

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