try-with-ressources 在创建和关闭之前无法创建新的 BufferedWriter
try-with-ressources can't create a new BufferedWriter after it's created and closed before
程序显示控制台菜单,您可以 select 直到 select (0) 并且程序退出。
首先,程序按预期运行,我能够 select 一个选项并调用 addPersonMenu()
或 deletePersonMenu()
。在 showMainMenu()
中的每个操作之后,菜单应该在控制台上重建,以便在 main 方法中再次调用 showMainMenu()
方法。但是这次它会抛出一个 IOException: Stream closed
并退出。
eclipse 中的调试模式显示 try-with-ressources
块无法打开新的 BufferedReader
,尽管它应该正确关闭并且应该释放资源。
有什么想法吗?
public static void main(String[] args) {
while(!exit) {
showMainMenu()
}
}
private static void showMainMenu() {
System.out.println("(1) Add new person");
System.out.println("(2) Edit existing person");
System.out.println("(3) Delete person");
System.out.println();
System.out.println("(5) Save changes");
System.out.println("(0) Exit without saving");
try (BufferedReader br = new BufferedReader(new InputStreamReader(
System.in))) {
switch (Integer.parseInt(br.readLine())) {
case (1):
addPersonMenu();
break;
case (2):
// editPersonMenu();
break;
case (3):
deletePersonMenu();
break;
case (5):
// saveChanges();
break;
case (0):
exit();
break;
default:
System.out.println("Invalid input! Repeat!");
}
} catch (IOException e) {
e.printStackTrace();
exit = true;
}
}
这是正常的:您在方法中关闭 System.in
。
你应该做的是这样的:
try (
// open the resource here
) {
String line;
while ((line = reader.readLine()) != null)
showMainMenu(line);
}
特别是因为每次重新打开 reader 无论如何都是浪费。
System.in是一个实现了Closeable的InputStream。因此,在 try 子句第一次退出后,流将关闭,再次使用时会出现 IOException。
程序显示控制台菜单,您可以 select 直到 select (0) 并且程序退出。
首先,程序按预期运行,我能够 select 一个选项并调用 addPersonMenu()
或 deletePersonMenu()
。在 showMainMenu()
中的每个操作之后,菜单应该在控制台上重建,以便在 main 方法中再次调用 showMainMenu()
方法。但是这次它会抛出一个 IOException: Stream closed
并退出。
eclipse 中的调试模式显示 try-with-ressources
块无法打开新的 BufferedReader
,尽管它应该正确关闭并且应该释放资源。
有什么想法吗?
public static void main(String[] args) {
while(!exit) {
showMainMenu()
}
}
private static void showMainMenu() {
System.out.println("(1) Add new person");
System.out.println("(2) Edit existing person");
System.out.println("(3) Delete person");
System.out.println();
System.out.println("(5) Save changes");
System.out.println("(0) Exit without saving");
try (BufferedReader br = new BufferedReader(new InputStreamReader(
System.in))) {
switch (Integer.parseInt(br.readLine())) {
case (1):
addPersonMenu();
break;
case (2):
// editPersonMenu();
break;
case (3):
deletePersonMenu();
break;
case (5):
// saveChanges();
break;
case (0):
exit();
break;
default:
System.out.println("Invalid input! Repeat!");
}
} catch (IOException e) {
e.printStackTrace();
exit = true;
}
}
这是正常的:您在方法中关闭 System.in
。
你应该做的是这样的:
try (
// open the resource here
) {
String line;
while ((line = reader.readLine()) != null)
showMainMenu(line);
}
特别是因为每次重新打开 reader 无论如何都是浪费。
System.in是一个实现了Closeable的InputStream。因此,在 try 子句第一次退出后,流将关闭,再次使用时会出现 IOException。