一个 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)