概述

Java 的异常处理是 Java 运行时处理错误的一套机制。它的核心目标是:

  • 把正常业务逻辑和错误处理逻辑分离
  • 让程序遇到异常时能恢复、提示或者优雅退出
  • 避免程序因为一个错误直接崩溃

异常的体系结构

java.lang.Throwable
├── Error严重错误程序无法处理
   ├── OutOfMemoryError
   ├── StackOverflowError
   └── ...
└── Exception程序可以处理的异常
    ├── Checked Exception编译时异常
       ├── IOException
       ├── SQLException
       └── ...
    └── Unchecked Exception运行时异常RuntimeException
        ├── NullPointerException
        ├── ArrayIndexOutOfBoundsException
        ├── ClassCastException
        └── ...
  • Error(错误)

不建议捕获,如 OutOfMemoryError、StackOverflowError 通常是 JVM 层级的错误

  • Checked Exception(受检查异常)

编译阶段必须处理(捕获或抛出)常见如:IOException、SQLException

  • Unchecked Exception(非受检查异常)

编译器不会强制处理 多为编程错误:NullPointerException、ArithmeticException、ArrayIndexOutOfBoundsException

异常处理机制

  • try-catch-finally
try {
    // 可能抛出异常的代码
} catch (ExceptionType e) {
    // 处理异常
} finally {
    // 无论是否发生异常都会执行
}
  • 多异常处理
catch (IOException | SQLException e) {
    // 多个异常的统一处理
}
  • try-with-resources

try-with-resources 是 Java 7 引入的一个语法结构,用于自动关闭资源,避免忘记关闭资源导致内存泄漏或句柄耗尽

try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}
// 不需要手动调用 br.close()!

抛出异常

  • throw 语句
throw new IllegalArgumentException("参数非法");
  • throws

throws 的作用

将异常抛给调用者处理:如果一个方法内部可能抛出异常,但该方法自己不处理(没有 try-catch),就需要在方法签名中使用 throws 把异常抛出去,让调用者负责处理

让编译器检查异常是否被处理:对 Checked Exception(受检异常),Java 编译器会强制要求你

  • 要么用 try-catch 捕获
  • 要么用 throws 向上传递
public void readFile(String path) throws IOException {
    FileReader reader = new FileReader(path); // 可能抛出 IOException
}

调用者必须处理异常:

try {
    readFile("test.txt");
} catch (IOException e) {
    e.printStackTrace();
}