開發中,咱們經常須要在最後進行一些資源的關閉。好比讀寫文件流等,常見的,咱們會在最後的finally裏進行資源的關閉。可是這種寫法是很不簡潔的。其實,早在JDK1.7就已經引入了try-with-resources來關閉資源的方式,咱們今天就來體驗一下try-with-resources的簡潔之處。java
本文首發於頭條號【Happyjava】。Happy的掘金地址:juejin.im/user/5cc289…,Happy的我的博客:(blog.happyjava.cn)[blog.happyjava.cn]。歡迎轉載,但須保留此段聲明。程序員
在舊版的寫法中(其實如今還有不少程序員是這麼寫的),資源都放在finally塊裏進行關閉,以下:app
@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塊中關閉資源,因此inputStream只能定義在try塊的外面。關閉以前,還須要作一步判空,避免由於inputStream爲空而致使的空指針異常。這種寫法是很繁瑣的。ide
一樣的功能,若是採用try-with-resources,就會使代碼變得很是簡潔:spa
@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關鍵字的後面跟一個括號,把須要關閉的資源定義在括號內。在try塊執行完以後會自動的釋放掉資源。指針
並非全部資源均可以被try-with-resources自動關閉的,只有實現了java.lang.AutoCloseable接口的類,才能夠被自動關閉。若是沒有實現java.lang.AutoCloseable的類定義在try的括號內,則會在編譯器就報錯。code
如,自定義一個類MyResource,定義在括號內則會報錯:提示須要java.lang.AutoCloseable的類。cdn
咱們也能夠把本身的類編寫爲能夠被try-with-resources自動關閉的類,只須要咱們去實現java.lang.AutoCloseable接口便可。blog
class MyResource implements java.lang.AutoCloseable {
@Override
public void close() {
System.out.println("調用了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();
}
}
複製代碼
執行以後,會輸出「調用了close方法」接口
try-with-resources能夠使代碼更加簡潔並且不容易出錯。相比傳統的try-catch-finally的寫法,顯然try-with-resources優勢更多,至少不會存在finally關閉資源由於沒判空而致使空指針的問題。