java finally釋放資源問題?

時間 2021-06-06 00:26:02

1樓:Intopass

至少你應該這麼寫:

// 方法不丟擲異常,遇到讀取錯誤時返回null。

public

static

String

readFile

(String

file

)return

builder

.toString

();}

catch

(IOExceptione)

finally

}// 方法不返回null,遇到讀取錯誤時就丟擲錯誤。

public

static

String

readFile2

(String

file

)throws

IOException

return

builder

.toString

();}

finally

}private

static

void

safeClose

(Closeable

closeable

)catch

(IOExceptione)

}}第一種方法之所以要先將reader設定為null,是因為假設在try子塊裡定義reader,那麼finally子塊將看不到reader這個變數,那麼就沒法釋放reader這個資源了,而如果在try外面定義,new FileReader()時又有需要捕獲的異常,所以必須將定義和初始化分開。

而你舉的例子裡,你不捕獲異常而是丟擲異常,那麼確實可以直接定義在finally外面,且定義的同時初始化,但是正如你所說的,如果需要建立多個需要正確釋放的資源,那麼就有可能建立第乙個成功,但是建立第二個失敗,於是整體沒有進入try finally 語句就退出這個方法了,那麼第乙個正確建立的資源就沒有被正確關閉。

實際上如果同時有多個資源需要釋放,那麼在close時也是需要注意的,必須用我說的safeClose類似的語句,否則如果第乙個close失敗丟擲異常,那麼第二個資源就沒有機會正確釋放了。

2樓:Charlie W

new隨便乙個InputStream也是會有IoException的,第乙個寫法如果所在方法本身沒有throws IoException,還得加個try catch,不如放在同乙個try catch塊裡面,於是就變成第二種寫法了。

C 中,在資源釋放時必然有可能觸發異常的情況下,如何維持 RAII 語義?

Lee Revere 考慮的問題應該是如果析構函式出現了異常,你準備怎麼處理。如果有辦法處理,就try catch。否則,就把程式改成可以處理。 template void destructor Target t noexcept catch std exception etodotemplate ...

std thread如何釋放

雙休在家自己搞了一下.不知道算不算正確的解決方案.ChildThread include include DataBag.h class ChildThread include ChildThread.h include include ChildThread ChildThread DataBag...

甲醛到底是個什麼東西,哪些東西釋放甲醛,釋放週期多長,甲醛濃度多少算超標,開窗通風需要多久?

甲醛屠戶 家庭甲醛汙染源的原因,室內空氣汙染的形成,其實有幾個原因 當室內裝修時,家具和建築材料會釋放出大量的甲醛 由於室外 寵物皮毛等物品帶來的煙塵汙染 室內通風不足。乾燥空氣環境也是乙個因素。這個問題是結合在一起的。換句話說,生活在那裡的人們很容易患上呼吸道疾病,面臨著這些汙染危害。更重要的是,...