所以我写了这两个方法:
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;
}
(未测试,只是一个示例,显示其外观(
(最终最好让方法抛出异常,而不是处理它(