Java 简明教程

Java - Nested Try Block

Nested Try Block

try block 可嵌套在另一个尝试块中。此结构被称为嵌套尝试块。每当 exception 在嵌套尝试块中引发时,其异常将被推送到堆栈中。异常从子尝试块传播到父尝试块,依此类推。

Syntax

嵌套 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 语句,在这种情况下,当前方法停止执行,并且异常会抛出到调用堆栈上先前的那个方法。

Pointer To Remember While Using Nested Try Block

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

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

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

Java Nested Try Block Example

以下代码段展示了如何使用嵌套 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

More Examples

Example 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

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