java.util.NoSuchElementException при использовании сканера

Итак, после вызова функции (в моей основной), которую я опубликую ниже, создание нового объекта сканера в той же основной не сработало и дало мне следующую ошибку:

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)

связывая меня с последней строкой в ​​этом коде:

    int numHouse = 0;
    int numSeed = 0;
    System.out.println("Enter the total number of houses on the board: ");
    Scanner houseInput = new Scanner(System.in);
    numHouse = houseInput.nextInt();

который помещается сразу после того, как я вызываю функцию (позже я закрываю сканер в приведенном выше коде). Когда я комментирую вызов функции, этот сканер работает, поэтому что-то в функции вызывает ошибку в сканере. Я потратил часы на поиски, но не смог решить эту проблему, был бы очень признателен, если бы кто-нибудь мог. Функция:

    public void InitializePlayers() {
    //change numPlayers to variable that contains number of players
    boolean validInput = false;
    do {
        System.out.print("Enter Number of Players (1/2): ");
        Scanner userInput = new Scanner(System.in); 
        int numPlayers = userInput.nextInt();
        System.out.print("\n");
        if(numPlayers == 1) {
            //One Human Player, One AI Player
            System.out.println("Single Player Selected");
            validInput = true;
            System.out.print("\n");             
            System.out.print("Enter Player One Name: ");

            //Initialize Player 1
            String p0_name = userInput.next();
            Player Human1 = new Player(p0_name,0,false);
            this.setPlayer0(Human1);

            //Initialize AI
            String AI_name = "Hal";
            Player AI = new Player(AI_name,1,true);
            this.setPlayer1(AI);
            userInput.close();
        }
        else if(numPlayers == 2){
            //Two Human Players
            System.out.println("Two Players Selected");
            validInput = true;
            System.out.print("Enter Player One Name: ");

            //Initialize Player 1
            String p0_name = userInput.next();
            Player Human1 = new Player(p0_name,0,false);
            this.setPlayer0(Human1);

            //Initialize Player 2
            System.out.print("Enter Player Two Name: ");
            String p1_name = userInput.next();
            Player Human2 = new Player(p1_name,0,false);
            this.setPlayer1(Human2);
            userInput.close();
        }
        else {
            System.out.println("Error, Player 1 Not set!");
            userInput.close();
        }
    }while(!validInput);
}

(Я всегда ввожу 2, когда проверяю это) Я пытался удалить цикл do-while, но это не решило проблему. Спасибо


comment
проверьте это stackoverflow.com/questions /15398703/   -  person Kirk Patrick Brown    schedule 01.11.2017
comment
Вы пытались создать сканер вне цикла и не закрывать его в блоке else?   -  person Jose Romero    schedule 01.11.2017


Ответы (2)


Лучше, если можно использовать один сканер для чтения из System.in для всего приложения.

Закрытие сканера, который принимает игрока, закроет InputStream, что вызовет это исключение NoSuchElmentException. Лучше, если вы сможете определить один сканер и использовать его в обоих случаях при вводе.

person Ayeshmantha Perera    schedule 01.11.2017

Как сказал другой парень, я наконец нашел проблему. Закрытие сканера однажды закрыло InputStream, и поэтому его нельзя было использовать снова. Пришлось сделать один сканер при старте моего основного и передать его всем функциям, которые в нем нуждались. Я удалил все закрытия из каждой функции и просто закрыл в конце main.

person AJ.N    schedule 01.11.2017