Java 错误处理:try/catch 及更多——完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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"))) {    // 代码}

博客

书籍推荐