Java9 Try-With-Resources
在這篇文章中,我們將討論Java SE 9中的一些改進Try-With-Resources
語句。現在讓我們開始學習這個構造。
Java SE 7:Try-With-Resources基礎知識
Java SE 7引入了一個新的構造:Try-With-Resources
語句,用於更好的異常處理。 如果沒有這個構造,開發人員必須編寫大量冗餘和難看的代碼。 如果開發人員忘記正確關閉資源,那麼可能在應用程序中有資源泄漏問題。
這個新功能的主要目標是:
- 語法更精簡,避免寫一些
try-catch/finally
塊。 - 代碼且有更好的可讀性
- 不需要做空檢查
- 無需檢查資源引用是指引用對象還是
null
。 - 更好的資源管理,ARM(自動資源管理)
- 避免內存泄漏
Try-With-Resources 示例-1
void testARM_Before_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("mytest.txt"));
try (BufferedReader reader2 = reader1) {
System.out.println(reader2.readLine());
}
}
這裏創建了一個實用程序方法,它創建一個BufferedReader
對象來讀取文件的內容。 如果觀察上面的代碼片段,即使reader1
引用了BufferedReader
對象,也應該創建一個重複的reader2
來在Try-With-Resources
中使用它。 這是Java SE 7或8版本中的一個小錯誤或問題。
我們不能在Try-With-Resources
語句的try()
塊內使用任何資源(在Try-With-Resources
之外聲明)。
以下代碼在Java SE 7或8版本中無效,它會引發編譯時錯誤。
Try-With-Resources 示例-2
void testARM_Before_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("mytest.txt"));
try (reader1) {
System.out.println(reader1.readLine());
}
}
Java SE 7:Try-With-Resources規則
在Java SE 7或8版本中,我們應該遵循這些規則爲自動資源管理(ARM)來使用Try-With-Resources
語句,
- 任何資源(其中預定義的Java API類或用戶定義的類)必須實
java.lang.AutoCloseable
。 - 資源對象必須引用
final
或有效的final
變量 - 如果資源已經在
Try-With-Resources
語句之外聲明,則應該重新引用局部變量(如上面的示例-1中的代碼所示) - 新創建的局部變量可以在
Try-With-Resources
語句中使用。
Java SE 9:Try-With-Resources改進
Java SE 9爲Try-With-Resources語句提供了一些改進。 正如我們在前面幾節中討論的那樣,Java SE 7或8版本在這個語句中有一個小問題或錯誤。
在Java SE 9中,如果我們有一個已經在Try-With-Resource
語句之外聲明的資源作爲final
或有效的final
,那麼不需要聲明局部變量。 我們可以在Try-With-Resource
語句中使用以前創建的變量,沒有任何問題,如下所示:
Try-With-Resources 示例-3
void testARM_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("mytest.txt"));
try (reader1) {
System.out.println(reader1.readLine());
}
}
這個例子是Java SE 9的有效代碼。我們不會像示例1 所示的那樣創建另一個局部變量,如reader2
來引用reader1
。下面在Java SE 9 REPL中執行這兩個示例來測試它們。如下所示 -
jshell> void testARM_Before_Java9() throws IOException{
...> BufferedReader reader1 = new BufferedReader(new FileReader("mytest.txt"));
...> try (BufferedReader reader2 = reader1) {
...> System.out.println(reader2.readLine());
...> }
...> }
| created method testARM_Before_Java9()
jshell> testARM_Before_Java9()
mytest
測試示例-3使用Java SE 9 REPL
jshell> void testARM_Java9() throws IOException{
...> BufferedReader reader1 = new BufferedReader(new FileReader("mytest.txt"));
...> try (reader1) {
...> System.out.println(reader1.readLine());
...> }
...> }
| created method testARM_Java9()
jshell> testARM_Java9()
mytest
上面就是「Java SE 9:Try-With-Resources改進」新功能的全部內容。