一个 try 块可以嵌套在另一个 try 块内。这种结构称为嵌套 try 块。每当在嵌套的 try 块内引发异常时,该异常会被推送到栈中。异常会从子 try 块传播到父 try 块,依此类推。
嵌套 try 块的语法
嵌套 catch 块的语法如下:
try {
try {
}
catch(ExceptionType1 e1){
}
} catch (ExceptionType2 e1) {
}
上述语句展示了两个 try/catch 块,但实际上您可以根据需要使用任意数量的它们。如果在受保护的子代码中发生了异常,异常将被抛给子列表中的 catch 块。如果抛出的异常的数据类型与 ExceptionType1 匹配,那么它将在这个 catch 块被捕获。如果不匹配,异常将传递给父 catch 语句。这个过程将持续进行,直到异常被捕获或者没有匹配的 catch 块,在这种情况下,当前方法停止执行并将异常传递给调用栈上的前一个方法。
使用嵌套 try 块时需注意的事项
-
子
catch 块应具有特定的异常以提高代码清晰度。父 catch 块可以处理更通用的异常,这样如果子 catch 块无法处理异常,父 catch 块可以处理它。
-
在子
catch 块与父 catch 块之间使用的异常层次结构没有限制。
-
如果在子
catch 块中正确处理了异常,那么在父级中可以再次引发并处理另一个异常。
Java 嵌套 try 块示例
以下是一个代码段,展示了如何使用嵌套的 try/catch 语句。在此示例中,我们在嵌套的 try 块中通过除以零来制造一个错误。子 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("异常抛出:" + e);
}
System.out.println("访问第三个元素:" + a[3]);
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("异常抛出:" + e);
}
System.out.println("离开块");
}
}
输出:
异常抛出:java.lang.ArithmeticException: / by zero
异常抛出:java.lang.ArrayIndexOutOfBoundsException: 3
离开块
更多示例
示例 1
在以下代码段中,我们展示了嵌套 try/catch 语句的另一个例子。在此示例中,我们在嵌套的 try 块中通过除以零来制造一个错误,但在相应的 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("异常抛出:" + e);
}
System.out.println("访问第三个元素:" + a[3]);
}
catch (Exception e) {
System.out.println("异常抛出:" + e);
}
System.out.println("离开块");
}
}
输出:
异常抛出:java.lang.ArithmeticException: / by zero
离开块
示例 2
在以下代码段中,我们展示了没有任何 catch 块处理异常的嵌套 try/catch 语句的情况。在此示例中,我们在嵌套的 try 块中通过除以零来制造一个错误,但我们未在任何 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("异常抛出:" + e);
}
System.out.println("访问第三个元素:" + a[3]);
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("异常抛出:" + e);
}
System.out.println("离开块");
}
}
输出:
主线程异常:java.lang.ArithmeticException: / by zero
at com.tutorialspoint.ExcepTest.main(ExcepTest.java:10)