捕获异常
约 665 字大约 2 分钟
2025-07-15
在 Java 中,可以使用 try ... catch 语句来捕获可能抛出的异常。try 块包含可能发生异常的语句,而 catch 块用于捕获特定类型的 Exception 及其子类。
2.1 多 catch 语句
可以使用多个 catch 语句来分别捕获不同类型的 Exception 及其子类。JVM 在捕获到异常后,会从上到下匹配 catch 语句,一旦匹配到某个 catch,就会执行该 catch 块中的代码,并且不再继续匹配后续的 catch 语句。因此,多个 catch 语句中只有一个会被执行。
当存在多个 catch 语句时,catch 的顺序非常重要。子类异常的 catch 必须放在父类异常的 catch 前面。例如:
public static void main(String[] args) {
try {
process1();
process2();
process3();
} catch (UnsupportedEncodingException e) {
System.out.println("Bad encoding");
} catch (IOException e) {
System.out.println("IO error");
}
}在上面的代码中,UnsupportedEncodingException 是 IOException 的子类,所以 UnsupportedEncodingException 的 catch 块必须放在 IOException 的 catch 块前面,否则,UnsupportedEncodingException 异常将永远不会被捕获,因为会被父类 IOException 的 catch 语句提前捕获。
2.2 finally 语句
finally 语句块用于定义无论是否发生异常都需要执行的代码。这通常用于执行清理操作,例如关闭文件流或释放资源。
无论是否发生异常,finally 语句块都会被执行。如果没有发生异常,try 块中的语句会正常执行,然后执行 finally 块。如果发生了异常,try 块中的语句会中断执行,然后跳转到匹配的 catch 块执行,最后执行 finally 块。
特点:
finally语句不是必须的,可以省略。finally语句总是最后执行。
在某些情况下,可以没有 catch 块,只使用 try ... finally 结构。这通常用于在方法声明了可能抛出的异常时,确保某些代码始终执行。例如:
void process(String file) throws IOException {
try {
...
} finally {
System.out.println("END");
}
}由于方法声明了可能抛出的 IOException 异常,因此可以不使用 catch 块来捕获异常,而是使用 finally 块来确保 System.out.println("END"); 语句始终执行。
2.3 捕获多种异常
如果多个异常的处理逻辑相同,但这些异常之间不存在继承关系,可以使用 | 符号将它们合并到一个 catch 块中。例如:
public static void main(String[] args) {
try {
process1();
process2();
process3();
} catch (IOException | NumberFormatException e) {
// IOException或NumberFormatException
System.out.println("Bad input");
} catch (Exception e) {
System.out.println("Unknown error");
}
}在上面的代码中,IOException 和 NumberFormatException 具有相同的处理逻辑,因此可以使用 catch (IOException | NumberFormatException e) 将它们合并到一个 catch 块中进行处理。