Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤和異常

Java 多執行緒

Java 同步

Java 網路

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 和框架

Java 類參考

Java 有用資源

Java - 巢狀 Try 塊



巢狀 Try 塊

一個 try 塊 可以巢狀在另一個 try 塊中。這種結構稱為巢狀 try 塊。每當在巢狀 try 塊中引發 異常 時,其異常會被推送到堆疊中。異常從子 try 塊傳播到父 try 塊,依此類推。

語法

巢狀 catch 塊的語法如下所示:

try { // parent try block
   try {  // child try block
   
   }
   catch(ExceptionType1 e1){  // child catch block
   
   }
} catch (ExceptionType2 e1) { // parent catch block

} 

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

使用巢狀 Try 塊時要記住的要點

  • 子 catch 塊應該有特定的異常以提高程式碼清晰度。父 catch 塊可以處理更通用的異常,以便如果子 catch 塊無法處理異常,則父 catch 塊可以處理它。

  • 在子 catch 塊與父 catch 塊中使用異常層次結構沒有限制。

  • 如果異常在子 catch 塊中被正確處理,則在父 catch 塊中可以引發並處理另一個異常。

Java 巢狀 Try 塊示例

以下程式碼段顯示瞭如何使用巢狀 try/catch 語句。在此示例中,我們透過在巢狀 try 塊中將值除以 0 來建立錯誤。子 catch 塊正在處理異常並列印相同的內容。現在在父 try 塊中,我們再次透過在訪問陣列元素時使用無效的陣列索引來建立錯誤,並引發異常。

package com.tutorialspoint;

public class ExcepTest {

   public static void main(String args[]) {
      try {
         int a[] = new int[2];
         try {
            int b = 0;
            int c = 1/b;
         }catch(Exception e) {
            System.out.println("Exception thrown: " + e);
         }
         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.ArithmeticException: / by zero
Exception thrown: java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

更多示例

示例 1

在此程式碼段中,我們展示瞭如何使用巢狀 try/catch 語句的另一個示例。在此示例中,我們透過在巢狀 try 塊中將值除以 0 來建立錯誤,但我們沒有在相應的 catch 塊中進行處理。由於父 try 塊正在處理作為通用異常引發的異常,因此它捕獲了子 catch 塊引發的異常並列印相同的內容。

package com.tutorialspoint;

public class ExcepTest {
   public static void main(String args[]) {
      try {
         int a[] = new int[2];
         try {
            int b = 0;
            int c = 1/b;
         }catch(ArrayIndexOutOfBoundsException e) {
            System.out.println("Exception thrown: " + e);
         }
         System.out.println("Access element three :" + a[3]);
      }
      catch (Exception e) {
         System.out.println("Exception thrown: " + e);
      }
      System.out.println("Out of the block");
   }
}

輸出

Exception thrown: java.lang.ArithmeticException: / by zero
Out of the block

示例 2

在此程式碼段中,我們展示了巢狀 try/catch 語句中沒有任何 catch 塊處理異常的情況。在此示例中,我們透過在巢狀 try 塊中將值除以 0 來建立錯誤,但我們沒有在任何 catch 塊中處理此類異常。現在 JVM 將捕獲異常並終止程式,而不會列印最後一條語句。

package com.tutorialspoint;

public class ExcepTest {
   public static void main(String args[]) {
      try {
         int a[] = new int[2];
         try {
            int b = 0;
            int c = 1/b;
         }catch(ArrayIndexOutOfBoundsException e) {
            System.out.println("Exception thrown: " + e);
         }
         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 in thread "main" java.lang.ArithmeticException: / by zero
	at com.tutorialspoint.ExcepTest.main(ExcepTest.java:10)
廣告