Java SE 9 try-with-resource的小改變

吳修福 Hugh Wu

  • 恆逸教育訓練中心-資深講師
  • 技術分類:程式設計

 

 

Java語言在發展至SE7時加進了try-with-resource的語法,只要「Resource」實作過java.lang.AutoCloseable這個介面,那麼在撰寫程式碼時可以讓整個例外處理的結構變得比較簡潔。

未使用try-with-resouce:

// resource 宣告
Resource res = null;
try {
	res = new Resource(); // resource 初始化
	// 其他處理
}
catch (Exception ex) {
	// 例外處理
}
finally {
	// resource 釋放或清除
}

使用try-with-resouce:

// 於 try 關鍵字後的小括號中進行 resource 宣告及初始化
try (Resource res = new Resource()) {
	// 其他處理
	// 在 try 後方小括號初始化的資源會在離開 try 區塊時自動呼叫 close()
}
catch (Exception ex) {
	// 例外處理
}

不過這個結構有些限制,如果需要在catch區塊中存取Resource的變數的話,那麼只能回到之前不使用try-with-resouce的結構來進行,因為try-with-resource要求需要被自動呼叫close方法的物件一定要在try後方的小括號中宣告及初始化,否則會引發編譯時期錯誤。

在Java SE9之後針對這個限制進行了一些改變,允許開發者如同未使用try-with-resource一樣在進入try區塊前先完成宣告及初始化,try之後的小括號中只要列出需要被自動呼叫close方法的變數即可。

Java SE9 try-with-resouce:

// resource 宣告
Resource res = new Resource();
try (res) {
	// 其他處理
	// 在 try 後方小括號的資源會在離開 try 區塊時自動呼叫 close()
}
catch (Exception ex) {
	// 例外處理
}

不過這邊要注意的是,不管是哪個版本的try-with-resource結構,其中的resource如果沒有宣告為final變數的話,也都會被視作是「effectively final(等效final)變數」,也就是不能在其有效範圍中進行變數異動,這在撰寫程式碼時要注意。

相關學習資源