鍍金池/ 教程/ Java/ Java9 Try-With-Resources
Java9多版本Jar( Multirelease JAR)
Java9 JavaDocs
Java9 @Deprecated注解
Java9 CompletableFuture API
Java9多分辨率圖像API
Java9教程
Java9 Repl(JShell)
Java9私有接口方法
Java9模塊系統(tǒng)
Java9簡(jiǎn)介
Java9內(nèi)部類(lèi)鉆石操作符
Java9開(kāi)發(fā)環(huán)境安裝
Java9集合工廠方法
Java9特性及示例
Java9 Optional類(lèi)
Java9 Process API
Java9 Stream API
Java9 Try-With-Resources

Java9 Try-With-Resources

在這篇文章中,我們將討論Java SE 9中的一些改進(jìn)Try-With-Resources語(yǔ)句?,F(xiàn)在讓我們開(kāi)始學(xué)習(xí)這個(gè)構(gòu)造。

Java SE 7:Try-With-Resources基礎(chǔ)知識(shí)

Java SE 7引入了一個(gè)新的構(gòu)造:Try-With-Resources 語(yǔ)句,用于更好的異常處理。 如果沒(méi)有這個(gè)構(gòu)造,開(kāi)發(fā)人員必須編寫(xiě)大量冗余和難看的代碼。 如果開(kāi)發(fā)人員忘記正確關(guān)閉資源,那么可能在應(yīng)用程序中有資源泄漏問(wèn)題。

這個(gè)新功能的主要目標(biāo)是:

  • 語(yǔ)法更精簡(jiǎn),避免寫(xiě)一些try-catch/finally塊。
  • 代碼且有更好的可讀性
  • 不需要做空檢查
  • 無(wú)需檢查資源引用是指引用對(duì)象還是null。
  • 更好的資源管理,ARM(自動(dòng)資源管理)
  • 避免內(nèi)存泄漏

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());
 }
}

這里創(chuàng)建了一個(gè)實(shí)用程序方法,它創(chuàng)建一個(gè)BufferedReader對(duì)象來(lái)讀取文件的內(nèi)容。 如果觀察上面的代碼片段,即使reader1引用了BufferedReader對(duì)象,也應(yīng)該創(chuàng)建一個(gè)重復(fù)的reader2來(lái)在Try-With-Resources中使用它。 這是Java SE 7或8版本中的一個(gè)小錯(cuò)誤或問(wèn)題。

我們不能在Try-With-Resources語(yǔ)句的try()塊內(nèi)使用任何資源(在Try-With-Resources之外聲明)。

以下代碼在Java SE 7或8版本中無(wú)效,它會(huì)引發(fā)編譯時(shí)錯(cuò)誤。

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規(guī)則

在Java SE 7或8版本中,我們應(yīng)該遵循這些規(guī)則為自動(dòng)資源管理(ARM)來(lái)使用Try-With-Resources語(yǔ)句,

  • 任何資源(其中預(yù)定義的Java API類(lèi)或用戶定義的類(lèi))必須實(shí)java.lang.AutoCloseable
  • 資源對(duì)象必須引用final或有效的final變量
  • 如果資源已經(jīng)在Try-With-Resources語(yǔ)句之外聲明,則應(yīng)該重新引用局部變量(如上面的示例-1中的代碼所示)
  • 新創(chuàng)建的局部變量可以在Try-With-Resources語(yǔ)句中使用。

Java SE 9:Try-With-Resources改進(jìn)

Java SE 9為T(mén)ry-With-Resources語(yǔ)句提供了一些改進(jìn)。 正如我們?cè)谇懊鎺坠?jié)中討論的那樣,Java SE 7或8版本在這個(gè)語(yǔ)句中有一個(gè)小問(wèn)題或錯(cuò)誤。

在Java SE 9中,如果我們有一個(gè)已經(jīng)在Try-With-Resource語(yǔ)句之外聲明的資源作為final或有效的final,那么不需要聲明局部變量。 我們可以在Try-With-Resource語(yǔ)句中使用以前創(chuàng)建的變量,沒(méi)有任何問(wèn)題,如下所示:

Try-With-Resources 示例-3

void testARM_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("mytest.txt"));
 try (reader1) {
   System.out.println(reader1.readLine());
 }
}

這個(gè)例子是Java SE 9的有效代碼。我們不會(huì)像示例1 所示的那樣創(chuàng)建另一個(gè)局部變量,如reader2來(lái)引用reader1。下面在Java SE 9 REPL中執(zhí)行這兩個(gè)示例來(lái)測(cè)試它們。如下所示 -

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

測(cè)試示例-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改進(jìn)”新功能的全部?jī)?nèi)容。