一个 try 块可以嵌套在另一个 try 块中。这种结构称为嵌套 try 块。每当在嵌套的 try 块中引发异常时,其异常就会被推送到 Stack。异常从子 try 块传播到父 try 块,依此类推。嵌套 catch 块的语法如下所示 -

语法

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

} 

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

要记住的要点

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

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

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

示例 1

以下代码段展示了如何使用嵌套的 try/catch 语句。在此示例中,我们通过在嵌套的 try 块中将值除以 0 来创建错误。子 catch 块正在处理异常并打印相同的异常。现在,在父 try 块中,我们在访问数组元素时再次使用无效的数组索引来创建错误,并引发异常。

package com.yxjc123;

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 

示例 2

在此代码段中,我们将展示如何使用嵌套 try/catch 语句的另一个示例。在此示例中,我们通过在嵌套的 try 块中将值除以 0 来创建错误,但我们没有在相应的 catch 块中进行处理。由于父 try 块正在处理作为通用异常引发的异常,因此它捕获子 catch 块引发的异常并打印相同的异常。

package com.yxjc123;

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 

示例 3

在此代码段中,我们展示了嵌套 try/catch 语句的情况,其中任何 catch 块都不处理异常。在此示例中,我们通过在嵌套的 try 块中将值除以 0 来创建错误,但我们不在任何 catch 块中处理此类异常。现在,JVM 将捕获异常并终止程序,而不打印最后一条语句。

package com.yxjc123;

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.yxjc123.ExcepTest.main(ExcepTest.java:10)