2010-04-17 67 views
7

關閉流我得到FindBugs的嚴重錯誤:方法可能無法在例外

的方法創建一個IO流對象,不將其分配到任何領域,它傳遞給其他的方法,或歸還,並且不會在方法外的所有可能的異常路徑上關閉它。這可能會導致文件描述符泄漏。使用finally塊來確保流被關閉通常是一個好主意。

try { 
... 
stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
... 
} catch (IOException e) { 
    throw new RuntimeException(e); 
} finally { 
    try { 
     if (stdError != null) { 
      stdError.close(); 
     } 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 
} 

我需要關閉InputStreamReader也或p.getErrorStream(它返回InputStream)?

回答

4

BufferedReader和InputStreamReader在關閉時關閉底層流。你應該沒關係通過關閉stdError

5

當創建BufferedReader對象時引發異常時會發生什麼?由垃圾收集器決定銷燬該對象之前,在將來的某個時間,由InputStreamReader對象管理的流不會關閉。

如果創建InputStreamReader對象時發生異常,您可能會遇到類似的問題。

+1

你和findbugs在技術上是正確的。但是,BufferedReader構造函數失敗的唯一方法是使用'Error';例如OOME或SOE。應用程序不太可能嘗試從其中一箇中恢復,因此流的泄漏不太可能發生。 – 2010-04-17 14:53:03