Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java API 和框架

Java 类参考

Java 有用资源

Java - 嵌套 Try 块



嵌套 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

} 

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

使用嵌套 Try 块时要记住的要点

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

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

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

Java 嵌套 Try 块示例

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

package com.tutorialspoint;

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

更多示例

示例 1

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

package com.tutorialspoint;

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

示例 2

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

package com.tutorialspoint;

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