Java 简明教程

Java - Exception Propagation

Exception Propagation

Exception 传播是指异常事件从 nested try 或嵌套方法调用移动。一个 try 块可以嵌套在另一个 try block 内。类似地,一个 method 可以调用另一个方法,其中每个方法都可以独立处理异常或可以抛出已检查/未检查异常。每当在嵌套的 try 块/方法内引发异常时,其异常就会推入堆栈。该异常会从子 try 块或子方法传播到父 try 块或父方法,依此类推。

Syntax - Nested Try Block

嵌套 catch 块的语法如下所示 −

try { // parent try block
   try {  // child try block

   }
   catch(ExceptionType1 e1){  // child catch block

   }
} catch (ExceptionType2 e1) { // parent catch block

}

Syntax - Nested Method Calls

嵌套方法调用的语法如下所示 −

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 为止,在这种情况下,当前方法会停止执行,并将异常向下抛出到调用堆栈中的前一个方法。

Rules for Exception Propagation in Java

  1. 子 catch 块应具有特定的异常,以获得更清晰的代码。父 catch 块可以有更通用的异常处理,这样,如果子 catch 块无法处理异常,则父 catch 块可以处理它。

  2. 对于在子 catch 块与父 catch 块中使用异常层次没有限制。

  3. 如果在子 catch 块中正确处理了异常,则在父 catch 块中可以引发并处理另一个异常。

Java Exception Propagation Example

以下是显示从子到父的异常事件传播的代码段。在此示例中,我们在子方法中通过将值除以 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

More Examples

Example 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)

Example 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