2015-05-10 13 views
0

程序顯示控制檯菜單,您可以選擇內容直到您選擇(0)並退出程序。try-with-ressources在創建並關閉之前無法創建新的BufferedWriter

首先,程序按預期運行,我可以選擇一個選項並撥打addPersonMenu()deletePersonMenu()。在showMainMenu()中的每個操作之後,菜單應該在控制檯上重建,以便在主方法中再次調用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; 
    } 
} 
+1

'...雖然它應該被正確關閉和資源應該被釋放。「而這正是發生了什麼。 'BufferedReader',它包裝的'InputStreamReader'和支持它的'System.in'都正確關閉。不幸的是,一旦關閉,System.in就會關閉。 – biziclop

回答

2

這是正常的:您在您的方法中關閉System.in

你應該做的是這樣的:

try (
    // open the resource here 
) { 
    String line; 
    while ((line = reader.readLine()) != null) 
     showMainMenu(line); 
} 

尤其是因爲重新打開閱讀器每次是一種浪費呢。

1

System.in是一個實現Closeable的InputStream。因此,在try子句第一次退出後,該流將關閉,並且在再次使用它時會得到一個IOException。