BufferedReader закрывается в начале For-L oop в Java - PullRequest
0 голосов
/ 10 июля 2020

Я использую BufferedReader для ввода нескольких входных данных внутри цикла for; однако, когда первый вход поступает в первый раз, он выдает ошибку

java .io.Exception: Stream closed

Несмотря на то, что Я не закрываю его, пока не закончится for l oop. Код ниже:

        BufferedReader menu = new BufferedReader(new InputStreamReader(System.in));
        for (int i = 0; players.length > i; i++) {
            System.out.println("Choose the " + i + " player");
            System.out.println("1. New Player");
            System.out.println("2. Old Player");
            int choice2 = Integer.parseInt(menu.readLine());
            System.out.println("Which team are you on?");
            int playersTeam = Integer.parseInt(menu.readLine());
            Person player = new Person();
            if (choice2 == 1) {
                player.squadFilling();
                player.playerNaming();
            } else if (choice2 == 2) {
                break;
            }
        }
        menu.close();

Что вызывает ошибку sh и как это исправить? Спасибо за ваше время!

Stacktrace:

java.io.IOException: Stream closed
    at java.base/java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:168)
    at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:334)
    at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
    at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
    at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
    at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
    at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
    at Main.main(Main.java:409)

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Я думаю, вам стоит попробовать переместить menu.close(); в другой метод, вызываемый в конце. Также переместите BufferedReader menu в более высокий уровень видимости из метода и просто используйте menu = new BufferedReader(new InputStreamReader(System.in)); в методе.

BufferedReader menu;
void method(){
    menu = new BufferedReader(new InputStreamReader(System.in));
    for (int i = 0; players.length > i; i++) {
        System.out.println("Choose the " + i + " player");
        System.out.println("1. New Player");
        System.out.println("2. Old Player");
        int choice2 = Integer.parseInt(menu.readLine());
        System.out.println("Which team are you on?");
        int playersTeam = Integer.parseInt(menu.readLine());
        Person player = new Person();
        if (choice2 == 1) {
            player.squadFilling();
            player.playerNaming();
        } else if (choice2 == 2) {
            break;
        }
    }
    cleanup();
}

Это позволяет нам создать метод cleanup ().

private void cleanup(){
    menu.close();
}

Я думаю, что это может помочь, потому что я считаю, что menu.close () вызывается, пока писатель все еще заканчивает свою последнюю l oop. Думаю, добавление cleanup () как отдельного метода подойдет.

0 голосов
/ 13 июля 2020

Я пропустил некоторые .close() команды, помещенные в другом месте моего кода.

0 голосов
/ 10 июля 2020

В Java 8 он не выбрасывает никаких исключений (пробует тот же код). Работает нормально.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {

 public static void main(String[] args) throws NumberFormatException, IOException {

    BufferedReader menu = new BufferedReader(new InputStreamReader(System.in));
    for (int i = 0; 2 > i; i++) {
                    System.out.println("Choose the " + i + " player");
                    System.out.println("1. New Player");
                    System.out.println("2. Old Player");
                    int choice2 = Integer.parseInt(menu.readLine());
                    System.out.println("Which team are you on?");
                    int playersTeam = Integer.parseInt(menu.readLine());
                    if (choice2 == 1) {
                        continue;
                    } else if (choice2 == 2) {
                        break;
                    }
                    
    }
    menu.close();
 }
}
...