Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤與異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java APIs與框架

Java 類引用

Java 有用資源

Java - 異常傳播



異常傳播

異常傳播指的是異常事件從巢狀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

} 

語法 - 巢狀方法呼叫

巢狀方法呼叫的語法如下所示:

method1(){ // parent method 
   try { // parent try block
      method2();
   } catch (ExceptionType2 e1) { // parent catch block
} 
method2(){ // child method 
   // code to throw Exception
   // this exception will be handled by parent method
} 

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

Java異常傳播規則

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

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

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

Java異常傳播示例

這是一個程式碼段,它顯示了從子到父的異常事件傳播。在這個例子中,我們透過在子方法中將值除以0來建立一個錯誤。子方法丟擲異常。現在在父方法中,在try塊中,我們處理異常並列印錯誤訊息。

package com.tutorialspoint;

public class ExcepTest {

   public static void main(String args[]) {
      int a = 3;
      int b = 0;
      try {
         System.out.println("result:" + divide(a,b));
      }catch(ArithmeticException e) {
         System.out.println(e.getMessage());
      }
   }

   private static int divide(int a, int b) {
      return a / b;
   }
}

輸出

/ by zero

更多示例

示例1

這是一個程式碼段,它顯示了從子到父的異常事件傳播。在這個例子中,我們透過在子方法中將值除以0來建立一個錯誤。子方法丟擲異常。現在在父方法中,我們沒有處理異常。JVM將攔截異常並列印錯誤訊息。

package com.tutorialspoint;

public class ExcepTest {

   public static void main(String args[]) {
      int a = 3;
      int b = 0;
      System.out.println("result:" + divide(a,b));
   }

   private static int divide(int a, int b) {
      return a / b;
   }
}

輸出

Exception in thread "main" java.lang.ArithmeticException: / by zero
   at com.tutorialspoint.ExcepTest.divide(ExcepTest.java:12)
   at com.tutorialspoint.ExcepTest.main(ExcepTest.java:8)

示例2

本程式碼片段展示瞭如何使異常事件在子方法內部停止傳播,而不是傳播到父方法。在這個例子中,我們透過在子方法中用 0 除以一個值來建立一個錯誤。子方法處理了該異常。現在,在父方法中,我們不會接收到任何異常。

package com.tutorialspoint;

public class ExcepTest {

   public static void main(String args[]) {
      int a = 3;
      int b = 0;
      System.out.println("result:" + divide(a,b));
   }

   private static int divide(int a, int b) {
      try {
         return a / b;
      }catch(ArithmeticException e) {
         System.out.println(e.getMessage());
      }
   return 0;
   }
}

輸出

/ by zero
result:0
廣告