如何使用try-with-resource機制關(guān)閉連接
使用try-with-resource機制關(guān)閉連接
JAVA的一大特性就是JVM會對內(nèi)部資源實現(xiàn)自動回收
即自動GC,給開發(fā)者帶來了極大的便利。但是JVM對外部資源的引用卻無法自動回收,例如數(shù)據(jù)庫連接,網(wǎng)絡(luò)連接以及輸入輸出IO流等,這些連接就需要我們手動去關(guān)閉,不然會導(dǎo)致外部資源泄露,連接池溢出以及文件被異常占用等。
傳統(tǒng)的手動釋放外部資源一般放在
try{}catch(){}finally{}機制的finally代碼塊中,因為finally代碼塊中語句是肯定會被執(zhí)行的,即保證了外部資源最后一定會被釋放。同時考慮到finally代碼塊中也有可能出現(xiàn)異常,finally代碼塊中也有一個try{}catch(){},這種寫法是經(jīng)典的傳統(tǒng)釋放外部資源方法,顯然是非常繁瑣的。

JDK1.7之后有了try-with-resource處理機制
首先被自動關(guān)閉的資源需要實現(xiàn)Closeable或者AutoCloseable接口,因為只有實現(xiàn)了這兩個接口才可以自動調(diào)用close()方法去自動關(guān)閉資源。寫法為try(){}catch(){},將要關(guān)閉的外部資源在try()中創(chuàng)建,catch()捕獲處理異常。
其實try-with-resource機制是一種語法糖,其底層實現(xiàn)原理仍然是try{}catch(){}finally{}寫法,不過在catch(){}代碼塊中有一個addSuppressed()方法,即異常抑制方法。
如果業(yè)務(wù)處理和關(guān)閉連接都出現(xiàn)了異常,業(yè)務(wù)處理的異常會抑制關(guān)閉連接的異常,只拋出處理中的異常,仍然可以通過getSuppressed()方法獲得關(guān)閉連接的異常。

和傳統(tǒng)的try{}catch(){}finally{}機制相比,try-with-resource處理機制有了這個異常抑制方法就是幫助我們簡化了關(guān)閉連接時出現(xiàn)異常的處理。
try-with-resource使用時遇到的問題
java 1.7之后 增加了 try-wit-resource的語法糖
大概的用法就是在try中聲明一個或者多個的流,會在try塊代碼執(zhí)行完成后自動關(guān)閉流,不用再寫finally進行手都關(guān)閉。
try (InputStream is1 = ...;
InputStream is2 = ...;) {
//do something
} catch{
}
于是我就在項目中想改成這種寫法,但是在改的過程中遇到了一些問題。我的代碼中需要對聲明過后的流再賦值,但是用這樣的寫法一直會報錯
代碼大概是這樣的:

此時會編譯出錯:
The resource is1 of a try-with-resources statement cannot be assigned;
報錯的原因是:
try-with-source中聲明的變量無法被更改。但是我很奇怪這是為什么,上網(wǎng)搜了沒有搜到,于是去找了一下官方文檔。官方文檔中有一段這樣的描述:

It is a compile-time error if final appears more than once as a modifier for each variable declared in a resource specification. A variable declared in a resource specification is implicitly declared final (§4.12.4) if it is not explicitly declared final.
意思就是,try-with-resource中聲明的變量會隱式的加上final 關(guān)鍵字,所以無法再進行賦值。但是至于為什么這么設(shè)計,我暫時沒找到答案。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
在springboot中注入FilterRegistrationBean不生效的原因
這篇文章主要介紹了在springboot中注入FilterRegistrationBean不生效的原因及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
RestTemplate如何通過HTTP?Basic?Auth認證示例說明
這篇文章主要為大家介紹了RestTemplate如何通過HTTP?Basic?Auth認證的示例說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作
這篇文章主要介紹了redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
ApplicationListenerDetector監(jiān)聽器判斷demo
這篇文章主要為大家介紹了ApplicationListenerDetector監(jiān)聽器判斷demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
應(yīng)用Java泛型和反射導(dǎo)出CSV文件的方法
這篇文章主要介紹了應(yīng)用Java泛型和反射導(dǎo)出CSV文件的方法,通過一個自定義函數(shù)結(jié)合泛型與反射的應(yīng)用實現(xiàn)導(dǎo)出CSV文件的功能,具有一定的參考借鑒價值,需要的朋友可以參考下2014-12-12

