Java 错误处理:try/catch 及更多:从 A 到 Z
错误处理是 Java 中的关键概念之一,每位开发者都必须掌握。与许多语言不同,Java 提供了一套严格且设计周到的异常系统,使您能够编写可靠且可预测的代码。在本文中,我们将涵盖所有内容:从基本的 try/catch 到高级机制,如 try-with-resources 和自定义异常。
1. 基础:什么是异常及类层次结构
异常(exception)是中断程序正常执行流程的事件。在 Java 中,所有异常都是继承自 Throwable 的类的对象。层次结构的主要分支如下:
- Error — 通常不处理的严重问题(例如
OutOfMemoryError)。 - Exception — 程序可以处理的异常。
- RuntimeException(Exception 的子类)— 运行时异常,在编译阶段可以不检查。
所有异常分为两类:
- Checked(受检异常) — 必须处理。如果您不通过
try/catch处理或不使用throws声明,编译器将不允许代码编译。示例:IOException、SQLException。 - Unchecked(非受检异常) — 继承自
RuntimeException。可以不显式处理。示例:NullPointerException、ArithmeticException。
2. 主要机制:try、catch、finally
基本的异常处理块由三部分组成:
try { // 可能抛出异常的代码 int result = 10 / 0;} catch (ArithmeticException e) { // 异常处理 System.err.println("错误:除以零!");} finally { // 此块始终执行(即使有异常) System.out.println("finally 块已执行。");}重要事项:
catch块可以有一个或多个,用于处理不同类型的异常。finally块是可选的,但对于关闭资源(文件、连接)很有用。- 如果异常未被捕获,它将沿着调用栈向上传播。
Multi-catch(Java 7+) — 允许在一个块中捕获多种类型的异常:
try { // 代码} catch (IOException | SQLException e) { System.err.println("输入输出或 SQL 错误:" + e.getMessage());}3. Try-with-resources:自动关闭资源
从 Java 7 开始,引入了 try-with-resources 机制,它会自动关闭实现了 AutoCloseable(或 Closeable)接口的资源。这省去了为关闭文件、套接字等编写 finally 块的需要。
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { String line = reader.readLine(); System.out.println(line);} catch (IOException e) { System.err.println("读取文件错误:" + e.getMessage());} // reader 自动关闭优点:
- 代码更简洁、更短。
- 资源按正确顺序关闭(与创建顺序相反)。
- 如果 try 块和关闭时都抛出异常,则被抑制的异常会附加到主异常上。
您可以通过分号声明多个资源:
try (BufferedReader br = new BufferedReader(new FileReader("in.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"))) { // 代码}