Java 简明教程
Java - Nested Try Block
Nested Try Block
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
-
子 catch 块应具有特定的异常,以获得更清晰的代码。父 catch 块可以有更通用的异常处理,这样,如果子 catch 块无法处理异常,则父 catch 块可以处理它。
-
对于在子 catch 块与父 catch 块中使用异常层次没有限制。
-
如果在子 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)