2013-06-18 33 views
0

我想從使用BufferedReader的輸入中讀取一個。它第一次運作,但第二次運行我得到一個異常。從System.in BufferedReader輸入嘗試拋出異常

[email protected]:~/devel/java/pricecalc$ java frontend.CUI 
> gsdfgd 
Invalid command! 
> I/O Error getting string: java.io.IOException: Stream closed 
I/O Error: java.io.IOException: java.io.IOException: Stream closed 
> I/O Error getting string: java.io.IOException: Stream closed 
I/O Error: java.io.IOException: java.io.IOException: Stream closed 
> I/O Error getting string: java.io.IOException: Stream closed 

它只是在一個循環中繼續運行。我一定錯過了什麼。

public static void main(String args[]) { 
      if (args.length == 0) { 
        while (!exit) { 
          try { 
            exit = processLine(commandLine()); 
          } catch (IOException e) { 
            System.out.println("I/O Error: " + e); 
          } 
        } 
        System.out.println("Bye!"); 
      } else if (args.length == 1) { 
        String line = new String(args[0]); 
        processLine(line); 
      } else { 
        String line = new String(args[0]); 
        for (String np : args) { 
          line = new String(line + " " + np); 
        } 
        processLine(line); 
      } 
    } 

    static private String commandLine() throws IOException { 
      String str = new String(); 
      try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { 
        System.out.print("> "); 
        str = new String(br.readLine()); 
        str = str.trim(); 
      } catch (IOException e) { 
        System.out.println("I/O Error getting string: "+ str + " " + e); 
        throw new IOException(e); 
      } 

      return str; 
    } 

這真的好像都是關於commandLine()不工作的,所以我剛纔包含了這個和main。

+0

在哪裏定義了exit? –

+1

請發佈一個可編輯的程序。 –

+0

@RohitJain它的Java 7 – sanbhat

回答

7

是的,你在這裏關閉流:

try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) 

試圖與 - 資源語句將關閉BufferedReader在塊的結束,這將關閉InputStreamReader,這將關閉System.in

你不想這樣做,在這種情況下,所以只需使用:

// Deliberately not closing System.in! 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
try { 
    ... 
} 

它仍然是可能的,這將不完全的行爲,只要你想,雖然,作爲BufferedReader可能消耗(和緩衝區)更多數據。你最好創建BufferedReader一次(在調用代碼中)並將它傳遞給方法。

哦,我建議你擺脫這樣的:

String str = new String(); 

沒有必要爲它在所有。這會更好:

String str = ""; 

但即使如此,這是一個毫無意義的任務。同樣,您不需要從readLine()返回的字符串中創建一個新的字符串。只需使用:

return br.readLine().trim(); 

...在try區塊內。此外,在catch塊內記錄str沒有意義,因爲它將是空的 - 只有在讀取該行時纔會拋出IOException ...