生活随笔
收集整理的這篇文章主要介紹了
Java 7中的Try-with-resources
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文鏈接?作者:Jakob Jenkov 譯者:fangqiang08(fangqiang08@gmail.com)
Try-with-resources是java7中一個新的異常處理機制,它能夠很容易地關閉在try-catch語句塊中使用的資源。
利用Try-Catch-Finally管理資源(舊的代碼風格)
在java7以前,程序中使用的資源需要被明確地關閉,這個體驗有點繁瑣。
下面的方法讀取文件,然后用System.out打印:
| 01 | private?static?void?printFile()?throws?IOException { |
| 02 | ????InputStream input =?null; |
| 05 | ????????input = <strong>new?FileInputStream("file.txt")</strong>; |
| 07 | ????????int?data = <strong>input.read()</strong>; |
| 08 | ????????while(data != -1){ |
| 09 | ????????????System.out.print((char) data); |
| 10 | ????????????data = <strong>input.read()</strong>; |
| 13 | ????????if(input !=?null){ |
| 14 | ????????????<strong>input.close()</strong>; |
上面代碼中黑體字的程序可能會拋出異常。正如你所看到的,try語句塊中有3個地方能拋出異常,finally語句塊中有一個地方會能出異常。
不論try語句塊中是否有異常拋出,finally語句塊始終會被執行。這意味著,不論try語句塊中發生什么,InputStream 都會被關閉,或者說都會試圖被關閉。如果關閉失敗,InputStream’s close()方法也可能會拋出異常。
假設try語句塊拋出一個異常,然后finally語句塊被執行。同樣假設finally語句塊也拋出了一個異常。那么哪個異常會根據調用棧往外傳播?
即使try語句塊中拋出的異常與異常傳播更相關,最終還是finally語句塊中拋出的異常會根據調用棧向外傳播。
在java7中,對于上面的例子可以用try-with-resource 結構這樣寫:
| 01 | private?static?void?printFileJava7()?throws?IOException { |
| 03 | ????try(FileInputStream input =?new?FileInputStream("file.txt")) { |
| 05 | ????????int?data = input.read(); |
| 06 | ????????while(data != -1){ |
| 07 | ????????????System.out.print((char) data); |
| 08 | ????????????data = input.read(); |
注意方法中的第一行:
| 1 | try(FileInputStream input =?new?FileInputStream("file.txt")) { |
這就是try-with-resource 結構的用法。FileInputStream 類型變量就在try關鍵字后面的括號中聲明。而且一個FileInputStream 類型被實例化并被賦給了這個變量。
當try語句塊運行結束時,FileInputStream 會被自動關閉。這是因為FileInputStream 實現了java中的java.lang.AutoCloseable接口。所有實現了這個接口的類都可以在try-with-resources結構中使用。
當try-with-resources結構中拋出一個異常,同時FileInputStreami被關閉時(調用了其close方法)也拋出一個異常,try-with-resources結構中拋出的異常會向外傳播,而FileInputStreami被關閉時拋出的異常被抑制了。這與文章開始處利用舊風格代碼的例子(在finally語句塊中關閉資源)相反。
使用多個資源
你可以在塊中使用多個資源而且這些資源都能被自動地關閉。下面是例子:
| 01 | private?static?void?printFileJava7()?throws?IOException { |
| 03 | ????try(? FileInputStream???? input???????? =?new?FileInputStream("file.txt"); |
| 04 | ??????????BufferedInputStream bufferedInput =?new?BufferedInputStream(input) |
| 07 | ????????int?data = bufferedInput.read(); |
| 08 | ????????while(data != -1){ |
| 09 | ????????????System.out.print((char) data); |
| 10 | ????data = bufferedInput.read(); |
上面的例子在try關鍵字后的括號里創建了兩個資源——FileInputStream 和BufferedInputStream。當程序運行離開try語句塊時,這兩個資源都會被自動關閉。
這些資源將按照他們被創建順序的逆序來關閉。首先BufferedInputStream 會被關閉,然后FileInputStream會被關閉。
自定義AutoClosable 實現
這個try-with-resources結構里不僅能夠操作java內置的類。你也可以在自己的類中實現java.lang.AutoCloseable接口,然后在try-with-resources結構里使用這個類。
AutoClosable 接口僅僅有一個方法,接口定義如下:
| 1 | public?interface?AutoClosable { |
| 3 | ????public?void?close()?throws?Exception; |
任何實現了這個接口的方法都可以在try-with-resources結構中使用。下面是一個簡單的例子:
| 01 | public?class?MyAutoClosable?implements?AutoCloseable { |
| 03 | ????public?void?doIt() { |
| 04 | ????????System.out.println("MyAutoClosable doing it!"); |
| 08 | ????public?void?close()?throws?Exception { |
| 09 | ????????System.out.println("MyAutoClosable closed!"); |
doIt()是方法不是AutoClosable 接口中的一部分,之所以實現這個方法是因為我們想要這個類除了關閉方法外還能做點其他事。
下面是MyAutoClosable 在try-with-resources結構中使用的例子:
| 1 | private?static?void?myAutoClosable()?throws?Exception { |
| 3 | ????try(MyAutoClosable myAutoClosable =?new?MyAutoClosable()){ |
| 4 | ????????myAutoClosable.doIt(); |
當方法myAutoClosable.doIt()被調用時,下面是打印到System.out的輸出:
| 1 | MyAutoClosable doing it! |
通過上面這些你可以看到,不論try-catch中使用的資源是自己創造的還是java內置的類型,try-with-resources都是一個能夠確保資源能被正確地關閉的強大方法。
原創文章,轉載請注明:?轉載自并發編程網 – ifeve.com本文鏈接地址:?Java 7中的Try-with-resources
總結
以上是生活随笔為你收集整理的Java 7中的Try-with-resources的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。