异常传播是指从嵌套 try 或嵌套方法调用中传播异常事件。一个 try 块可以嵌套在另一个 try 块中。类似地,一个方法可以调用另一个方法,其中每个方法可以独立处理异常,或者可以抛出已检查/未检查的异常。每当在嵌套的 try 块/方法中引发异常时,其异常就会被推送到堆栈。异常从子 try 块传播到父 try 块,或者从子方法传播到父方法,依此类推。嵌套 catch 块的语法如下所示

语法 - 嵌套 Try 块

try { //父try块
   try {  //子try块
   
   }
   catch(ExceptionType1 e1){  //子catch块
   
   }
} catch (ExceptionType2 e1) { //父catch块

} 

语法 - 嵌套方法调用

method1(){ //父方法
   try { //父try块
      method2();
   } catch (ExceptionType2 e1) { //父catch块
} 
method2(){ //子方法
   //抛出异常的代码
   //此异常将由父方法处理
} 

前面的语句演示了两个 try /catch 块和方法,但您可以拥有任意数量的块和方法。如果受保护的子代码中发生异常,则该异常将被抛出到子列表的 catch 块中。如果抛出的异常的数据类型与 ExceptionType1 匹配,则会在那里捕获该异常。如果不是,则异常将传递到父 catch 语句。这种情况一直持续到异常被捕获或通过所有捕获,在这种情况下,当前方法停止执行,并且异常被抛出到调用堆栈上的前一个方法。

要记住的要点

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

  • 对异常没有限制在子catch块和父catch块中使用的层次结构。

  • 如果在子catch块中正确处理异常,那么在父catch块中,可以引发并处理另一个异常。

示例 1

这是显示异常事件从子级到父级的传播的代码段。在此示例中,我们通过在子方法中将值除以 0 来创建错误。子方法抛出异常。现在在父方法的 try 块中,我们正在处理异常并打印错误消息。

package com.yxjc123;

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 

示例 2

这里是代码显示从子级到父级的异常事件传播的片段。在此示例中,我们通过在子方法中将值除以 0 来创建错误。子方法抛出异常。现在在父方法中,我们不处理异常。 JVM 将拦截异常并打印错误消息。

package com.yxjc123;

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.yxjc123.ExcepTest.divide(ExcepTest.java:12)
   at com.yxjc123.ExcepTest.main(ExcepTest.java:8) 

示例 3

以下代码段显示异常事件传播在子进程中停止本身而不是流向父级。在此示例中,我们通过在子方法中将值除以 0 来创建错误。子方法正在处理异常。现在在父方法中,我们没有收到任何异常。

package com.yxjc123;

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