2014-11-06 40 views
1

這是我的代碼:在try塊內聲明RandomAccessFile對象會導致資源泄漏警告,但在外面聲明它不會?

try { 
    RandomAccessFile srcFile = new RandomAccessFile("src.txt", "rw"); 
} catch(FileNotFoundException e) { 
    e.printStackTrace(); 
} 

此代碼給我一個警告,RandomAccessFile對象SRCFILE永遠不會關閉。

但是,如果我修改我的代碼並在try塊外聲明srcFile(如下面的代碼所示),警告消失。

RandomAccessFile srcFile; 
try { 
    srcFile = new RandomAccessFile("src.txt", "rw"); 
} catch(FileNotFoundException e) { 
    e.printStackTrace(); 
} 

爲什麼會發生這種情況,因爲我沒有在任何情況下做srcFile.close();

回答

0
this從提取

如果一個資源被存儲在字段中,沒有單一的方法被認爲是 負責閉合;沒有問題被報道。

我想這是宣佈srcFiletry的範圍時發生了什麼。這意味着月食編譯器不能假設資源需要被關閉,因爲我仍然可以在創建範圍之外引用

由於JDK 1.7,你可以用try-with-resources解決這個問題:

try (RandomAccessFile srcFile = new RandomAccessFile("src.txt", "rw")) { 
    //Do something with srcFile 
} catch(IOException e) { 
    e.printStackTrace(); 
} 

請注意,srcFile將在嘗試執行後自動關閉。