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
广告