创建两个BufferedReaders关闭输入流



所以我写了这两个方法:

    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关闭。try with resources是否以某种方式关闭了System.in输入流,或者我误解了它的工作原理?

是否尝试使用资源关闭输入流中的System

是的。您不应该关闭System.in输入流。

参见:

  • 为什么我们不在使用System.out流之后关闭它

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;
}

(未测试,只是一个示例,显示其外观(

(最终最好让方法抛出异常,而不是处理它(

最新更新