0

I have a code which I have been trying to run. It gives me an 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;
    }
}

This error happens just after I read the names. Why would the error occur.

nedoKing
  • 3
  • 1
  • 1
    Possible duplicate of [java.util.NoSuchElementException - Scanner reading user input](https://stackoverflow.com/questions/13042008/java-util-nosuchelementexception-scanner-reading-user-input) – George Z. May 13 '19 at 17:41

1 Answers1

0

Your scanner takes System.in as the Input stream. When scanner.close() is called, it closes both your scanner as well as the input stream. Streams which are close cannot be reopened.

If you want to close your Scanner, you can create a single Scanner in your main method which you can close later. This can be passed as a parameter to your other two methods.

You can call your code like so

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;
}
BlackPearl
  • 1,662
  • 1
  • 8
  • 16