您好,登錄后才能下訂單哦!
你是否還在寫try-catch-finally?來使用try-with-resources優(yōu)雅地關(guān)閉流吧
前言
開發(fā)中,我們常常需要在最后進(jìn)行一些資源的關(guān)閉。比如讀寫文件流等,常見的,我們會在最后的finally里進(jìn)行資源的關(guān)閉。但是這種寫法是很不簡潔的。其實(shí),早在JDK1.7就已經(jīng)引入了try-with-resources來關(guān)閉資源的方式,我們今天就來體驗(yàn)一下try-with-resources的簡潔之處。
舊版關(guān)閉資源的一些例子
在舊版的寫法中(其實(shí)現(xiàn)在還有很多程序員是這么寫的),資源都放在finally塊里進(jìn)行關(guān)閉,如下:
@Test
public void test4() {
InputStream inputStream = null;
try {
inputStream = new FileInputStream("D:\\head.jpg");
// do something
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
這種寫法的麻煩之處在于,我們需要在finally塊中關(guān)閉資源,所以inputStream只能定義在try塊的外面。關(guān)閉之前,還需要做一步判空,避免因?yàn)閕nputStream為空而導(dǎo)致的空指針異常。這種寫法是很繁瑣的。
try-with-resources
同樣的功能,如果采用try-with-resources,就會使代碼變得非常簡潔:
@Test
public void test5() {
try (InputStream inputStream = new FileInputStream("D:\\head.jpg")) {
byte[] bytes = inputStream.readAllBytes();
// do something
} catch (IOException e) {
e.printStackTrace();
}
}
try-with-resources的用法就是,在try關(guān)鍵字的后面跟一個括號,把需要關(guān)閉的資源定義在括號內(nèi)。在try塊執(zhí)行完之后會自動的釋放掉資源。
什么資源可以被try-with-resources自動關(guān)閉
并不是所有資源都可以被try-with-resources自動關(guān)閉的,只有實(shí)現(xiàn)了java.lang.AutoCloseable接口的類,才可以被自動關(guān)閉。如果沒有實(shí)現(xiàn)java.lang.AutoCloseable的類定義在try的括號內(nèi),則會在編譯器就報(bào)錯。
如,自定義一個類MyResource,定義在括號內(nèi)則會報(bào)錯:提示需要java.lang.AutoCloseable的類。
自定義可以被自動關(guān)閉的類
我們也可以把自己的類編寫為可以被try-with-resources自動關(guān)閉的類,只需要我們?nèi)?shí)現(xiàn)java.lang.AutoCloseable接口即可。
class MyResource implements java.lang.AutoCloseable {
@Override
public void close() {
System.out.println("調(diào)用了close方法");
}
}
@Test
public void test5() {
try (InputStream inputStream = new FileInputStream("D:\\head.jpg");
MyResource myResource = new MyResource()) {
byte[] bytes = inputStream.readAllBytes();
// do something
} catch (IOException e) {
e.printStackTrace();
}
}
執(zhí)行之后,會輸出“調(diào)用了close方法”
總結(jié)
try-with-resources可以使代碼更加簡潔而且不容易出錯。相比傳統(tǒng)的try-catch-finally的寫法,顯然try-with-resources優(yōu)點(diǎn)更多,至少不會存在finally關(guān)閉資源因?yàn)闆]判空而導(dǎo)致空指針的問題。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。