2014-02-06 74 views
3

我仍然在學習Java後仍有資源泄漏,我需要一些幫助理解爲什麼這個代碼是錯誤的:關閉的BufferedReader

BufferedReader infile = new BufferedReader(new FileReader(file)); 
String regel = infile.readLine(); 
while (regel != null) { 
    // Do something with regel. 
    regel = infile.readLine(); 
} 
infile.close(); 

我實在看不出問題,但Eclipse的不斷告訴有資源泄漏並且infile未關閉。

(一個更詳細地,這個代碼代表在try塊,但我離開它離開保持簡單)

+2

想想如果'readLine'拋出一個異常,會發生什麼。 –

+0

Java 7支持[* AutoCloseable *](http://docs.oracle.com/javase/7/docs/api/java/lang/Au​​toCloseable.html) –

+0

試過http://www.compileonline.com上的代碼帶有try catch的/compile_java_online.php。它工作沒有任何抱怨。 – Wajahat

回答

3

Eclipse是抱怨由於參考可以不被關閉(例如,在一個異常);這就是你可以使用一個finally塊 - 也許像這樣

BufferedReader infile = null; 
try { 
    infile = new BufferedReader(new FileReader(file)); 
    String regel = infile.readLine(); 
    while (regel != null) { 
    // Do something with regel. 
    regel = infile.readLine(); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); // Log the exception. 
} finally { 
    if (infile != null) { 
    infile.close(); // close the resource. 
    } 
} 
0

你應該有一個try/catch塊。

另外,應使用以下代替:

while ((line = reader.readLine()) != null) { 
//do something with line; 
    } 
0

我覺得艾略特弗裏希是正確的,並指出主要的原因我想補充的唯一事情是你應該關閉流(在finally塊),因爲以確保在輸出成功的情況下任何輸出緩衝區都被刷新。如果刷新失敗,代碼應該通過異常退出。下面是另一個例子類似於你正在試圖解決,並確保你看看(準則1-2:釋放資源在所有情況下http://www.oracle.com/technetwork/java/seccodeguide-139067.html

final OutputStream rawOut = new FileOutputStream(file); 
    try { 
     final BufferedOutputStream out = 
      new BufferedOutputStream(rawOut); 
     use(out); 
     out.flush(); 
    } finally { 
     rawOut.close(); 
    }