Java 7的try-with-resource語法的目的是提高Java開發(fā)人員的效率,使得他們不需要在編寫代碼時(shí)考慮資源釋放問題,大多數(shù)的這類"清理"問題是由于異常發(fā)生時(shí)清理方法沒有被調(diào)用產(chǎn)生。
準(zhǔn)備構(gòu)造函數(shù)會(huì)拋出OpenException,swing()方法會(huì)拋出SwingException,close方法會(huì)拋出CloseException。
class OpenDoor implements AutoCloseable { public OpenDoor() throws Exception { System.out. }}); } }}
運(yùn)行上面的代碼,如果沒有拋出異常的話,輸出應(yīng)該是這樣的:
The door is open. The door is becoming unhinged. The door is closed. I'm putting a sweater on, regardless.三個(gè)異常目前被注釋掉了,現(xiàn)在讓我們一個(gè)個(gè)的拋出他們。
開始如果OpenDoor的構(gòu)造函數(shù)拋出異常時(shí)會(huì)發(fā)生什么?close()方法是否還會(huì)被自動(dòng)調(diào)用?讓我們來試一下就知道了,去掉構(gòu)造函數(shù)中異常代碼的注釋:
public OpenDoor() throws Exception { System.out.println("The door is open."); throw newOpenException();}
代碼打印的結(jié)果如下:
The door is open. Is there a draft? class OpenException I'm putting a sweater on, regardless.可以看到,當(dāng)構(gòu)造函數(shù)拋出異常時(shí)try-with-resource代碼體部分的代碼沒有被執(zhí)行。當(dāng)聲明資源時(shí),如果有異常拋出,可以認(rèn)為資源并未正確初始化,所以并需要釋放資源。然而,需要注意的時(shí),如果其他資源已被正確初始化,那么還是會(huì)按照聲明相反的順序調(diào)用那些資源的close()方法。
如果在swing方法中拋出異常,會(huì)發(fā)生什么呢?
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代碼塊的標(biāo)準(zhǔn)行為,盡管會(huì)使人很困惑:什么時(shí)候會(huì)執(zhí)行close方法?規(guī)則是:任何AutoCloseable對象的close方法會(huì)在任何catch塊代碼之前被執(zhí)行。
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
新聞熱點(diǎn)
疑難解答
圖片精選