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。