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