JAVA中try
塊的標準形式很通用,但有些常見的情況需要開發者小心編寫catch
和finally
塊。這些情況是清理或關閉不再需要使用的資源。
正常情況下,我們用try-catch-finally
語句來實現打開文件資源,最後再關閉清理文件資源。例如下面的代碼:
public class test1 {
public static void main(String[] args) {
FileInputStream file = null;
try {
file = new FileInputStream(new File("demo.txt"));
/*
* 處理這個文件的操作
*/
} catch(IOException e){
e.printStackTrace();
} finally {
//關閉資源
if(file != null) {
try {
file.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
發現這種操作很繁瑣,代碼也很多,那有沒有什麼簡便的方法呢?
就像python裏面的with
語句一樣呢
那麼恭喜你,確實有!
Java(從第7版起)提供了一種機制,能自動關閉需要清理的資源——處理資源的try
語句(try-with-resources, TWR)
。
下面簡單展示如何使用FileInputStream類打開文件(得到的對象需要處理)來介紹語法:
public class test1 {
public static void main(String[] args) {
try(InputStream is = new FileInputStream("demo.txt")){
/*
* 處理這個文件的操作
*/
}catch (IOException e) {
//這裏處理FileNoFoundExceotion等異常
e.printStackTrace();
}
}
}
發現這種新型的方法,去掉了finally塊,而且不需要編寫catch塊。
這種新型try
語句的參數都是需要清理的對象。這些對象(嚴格來說,這些對象必須實現AutoCloseable接口
)的作用域在try
塊中(也就是把要釋放的資源寫在 try 後的()中)
,不管 try
塊以何種方式退出,都會自動清理。開發者無需編寫任何catch
或finally
塊,Java編譯器會自動插入正確的清理代碼。
因此,我建議所有處理資源的新代碼都應該使用TWR
形式編寫,因爲這種形式比自己手動編寫catch
塊更少出錯,而且不會遇到麻煩的技術問題,例如終結機制
。
好了現在的Java:
注:表情來源於網絡:侵權刪