Java 中的 try catch finally 流程控制


使用 **try** 和 **catch** 關鍵字組合,方法可以捕獲異常。try/catch 塊放置在可能生成異常的程式碼周圍。try/catch 塊內的程式碼稱為受保護程式碼,使用 try/catch 的語法如下所示:

語法

try {
   // Protected code
} catch (ExceptionName e1) {
   // Catch block
}

容易發生異常的程式碼放在 try 塊中。當發生異常時,該異常由與其關聯的 catch 塊處理。每個 try 塊都應緊跟一個 catch 塊或 finally 塊。

catch 語句涉及宣告您嘗試捕獲的異常型別。如果在受保護程式碼中發生異常,則檢查 try 後面的 catch 塊(或塊)。如果發生的異常型別在 catch 塊中列出,則異常將傳遞給 catch 塊,就像引數傳遞到方法引數一樣。

示例

以下是聲明瞭 2 個元素的陣列。然後程式碼嘗試訪問陣列的第 3 個元素,這會丟擲異常。

// File Name : ExcepTest.java
import java.io.*;

public class ExcepTest {

   public static void main(String args[]) {

      try {
         int a[] = new int[2];
         System.out.println("Access element three :" + a[3]);
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("Exception thrown :" + e);
      }
      System.out.println("Out of the block");
   }
}

這將產生以下結果:

輸出

Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

多個 Catch 塊

try 塊後面可以跟多個 catch 塊。多個 catch 塊的語法如下所示:

語法

try {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}

前面的語句演示了三個 catch 塊,但您可以在單個 try 後面使用任意數量的 catch 塊。如果在受保護程式碼中發生異常,則該異常將被拋到列表中的第一個 catch 塊。如果丟擲的異常的資料型別與 ExceptionType1 匹配,則它將在那裡被捕獲。如果不是,則異常傳遞到第二個 catch 語句。這將持續進行,直到異常被捕獲或穿過所有 catch,在這種情況下,當前方法將停止執行,並且異常將向下拋到呼叫堆疊上的前一個方法。

示例

以下程式碼段顯示瞭如何使用多個 try/catch 語句。

try {
   file = new FileInputStream(fileName);
   x = (byte) file.read();
   } catch (IOException i) {
      i.printStackTrace();
      return -1;
   } catch (FileNotFoundException f) // Not valid! {
      f.printStackTrace();
      return -1;
   }

捕獲多種型別的異常

從 Java 7 開始,您可以使用單個 catch 塊處理多個異常,此功能簡化了程式碼。以下是如何執行此操作:

catch (IOException|FileNotFoundException ex) {
   logger.log(ex);
   throw ex;

Finally 塊

finally 塊位於 try 塊或 catch 塊之後。無論是否發生異常,finally 塊中的程式碼始終都會執行。

使用 finally 塊允許您執行任何您想要執行的清理型別語句,無論受保護程式碼中發生什麼情況。

finally 塊出現在 catch 塊的末尾,並具有以下語法:

語法

try {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}finally {
   // The finally block always executes.
}

示例

public class ExcepTest {

   public static void main(String args[]) {

      int a[] = new int[2];
      try {
         System.out.println("Access element three :" + a[3]);
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("Exception thrown :" + e);
      } finally {
         a[0] = 6;
         System.out.println("First element value: " + a[0]);
         System.out.println("The finally statement is executed");
      }
   }
}

這將產生以下結果:

輸出

Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed

注意以下幾點:

  • catch 子句不能獨立存在,必須與 try 語句一起使用。

  • 在存在 try/catch 塊時,不必包含 finally 子句。

  • try 塊不能獨立存在,必須與 catch 子句或 finally 子句一起使用。

  • try、catch、finally 塊之間不能存在任何程式碼。

更新於: 2020年6月21日

7K+ 瀏覽量

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告