Java 7的try-with-resource語法的目的是提高Java開發人員的效率,使得他們不需要在編寫代碼時考慮資源釋放問題,大多數的這類"清理"問題是由于異常發生時清理方法沒有被調用產生。
準備構造函數會拋出OpenException,swing()方法會拋出SwingException,close方法會拋出CloseException。
class OpenDoor implements AutoCloseable { public OpenDoor() throws Exception { System.out. }}); } }}
運行上面的代碼,如果沒有拋出異常的話,輸出應該是這樣的:
The door is open. The door is becoming unhinged. The door is closed. I'm putting a sweater on, regardless.三個異常目前被注釋掉了,現在讓我們一個個的拋出他們。
開始如果OpenDoor的構造函數拋出異常時會發生什么?close()方法是否還會被自動調用?讓我們來試一下就知道了,去掉構造函數中異常代碼的注釋:
public OpenDoor() throws Exception { System.out.println("The door is open."); throw newOpenException();}
代碼打印的結果如下:
The door is open. Is there a draft? class OpenException I'm putting a sweater on, regardless.可以看到,當構造函數拋出異常時try-with-resource代碼體部分的代碼沒有被執行。當聲明資源時,如果有異常拋出,可以認為資源并未正確初始化,所以并需要釋放資源。然而,需要注意的時,如果其他資源已被正確初始化,那么還是會按照聲明相反的順序調用那些資源的close()方法。
如果在swing方法中拋出異常,會發生什么呢?
The door is open. The door is becoming unhinged. The door is closed. Is there a draft? class SwingException I'm putting a sweater on, regardless.從上面的輸出我們可以了解到:
SwingException
只是try-with-resources代碼塊的標準行為,盡管會使人很困惑:什么時候會執行close方法?規則是:任何AutoCloseable對象的close方法會在任何catch塊代碼之前被執行。
The door is open.The door is becoming unhinged.The door is closed.Is there a draft? class CloseExceptionI'm putting a sweater on, regardless.我是天王蓋地虎的分割線
參考:http://www.4byte.cn/learning/84919/java-7-xin-te-xing-zi-dong-zi-yuan-guan-li-arm-he-autoclosable-jie-kou-jiao-cheng.html
新聞熱點
疑難解答