Создание двух BufferedReaders закрывает поток ввода? - PullRequest
0 голосов
/ 05 марта 2020

Итак, я написал эти два метода:

    public Player readPlayerData() {
        Player player = new Player();
        try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in))){
            System.out.println("What is your name?");
            player.setName(br.readLine());
            System.out.println("How much money do you have?");
            player.setBalance(BigDecimal.valueOf(Double.parseDouble(br.readLine())));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(player);
        return player;
    }

    public Currency readPlayerCurrency() {
        Currency currency = null;
        try(BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in))){
            System.out.println("What is your currency?");
            currency = Currency.valueOf(br2.readLine());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(currency);
        return currency;
    }

Когда я вызываю по одному, они работают как положено, но когда я вызываю их после каждого другого, я получаю java .io.IOException: Stream закрыто. Пытается ли с ресурсами закрыть входной поток System.in или я неправильно понимаю, как это работает?

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Попытка с ресурсами закрыть входной поток System.in

Да, это так. Вы не должны закрывать System.in входной поток.

См .:

0 голосов
/ 05 марта 2020

Основная функция try-with-reource предназначена для автоматического закрытия ресурса - это не требуется для System.in, поэтому используйте обычный оператор try-catch, например:

public Player readPlayerData() {
    Player player = new Player();
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("What is your name?");
        player.setName(br.readLine());
        System.out.println("How much money do you have?");
        player.setBalance(BigDecimal.valueOf(Double.parseDouble(br.readLine())));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(player);
    return player;
}

( не проверено, просто пример, чтобы показать, как это выглядит)

(в конечном итоге лучше, чтобы метод генерировал исключение вместо его обработки)

...