捕获异常
约 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
块中进行处理。