簡體   English   中英

為什么我需要最終使用關閉資源?

[英]Why do I need to use finally to close resources?

大多數時候,我看到的finally塊僅用於

FileInputStream f;
try{
    f= new FileInputStream("sample.txt");
    //something that uses f and sometimes throws an exception
}
catch(IOException ex){
    /* Handle it somehow */
}
finally{
    f.close();
}

我的問題是,如果f的范圍以封閉塊結尾,為什么我們需要在finally中將其關閉?

因為垃圾回收與資源清理不是一回事。

例如,如果您有一個超出范圍的JDBC連接對象,則沒有信號發送到數據庫服務器以指示不再需要打開的游標和連接。 沒有這些消息,您最終將耗盡可用的游標和連接數。

與文件句柄和任何其他資源相同。 自己清理后。

好吧,您給出了一個不好的例子-我懷疑您指的是類似FileInputStream東西-但基本的原因是Java沒有確定性的終結處理。

變量 f的范圍以聲明它的塊(不是try塊)結尾,但這並不意味着不再有對該對象的“活動”引用-垃圾收集器將既不最終確定該對象也不垃圾以任何確定的方式收集它。

除非您想讓資源閑置任意時間(並延遲垃圾回收,因為終結器需要在最終釋放內存之前進行額外的一輪收集),否則您應該顯式關閉資源。

基本上,Java 支持在相同的方式,C ++做RAII; 您不應該像使用C ++一樣嘗試使用它。

因為即使您引發異常,每次都會調用finally。 最后一塊確保您將關閉文件/連接。

原因是Java不能保證一旦對對象的特定引用超出范圍,該對象將立即被垃圾回收。 因此,對於引用有限系統資源的對象(例如文件描述符),僅等待垃圾回收是不夠的。

但是請注意, java.io.File實際上不是這樣的對象。

我們最終通過try catch處理了異常,每次執行時都會最終阻塞,但不能保證catch是因為catch塊僅在參數中傳遞的異常匹配時才執行。 例如,如果我們打開了任何數據庫連接,那么必須在離開前將其關閉,然后必須將其實施到最后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM