java 异常总结

Java 异常体系是处理程序运行时错误的重要机制,它提供了一种结构化的方式来捕获和处理异常情况。以下是对 Java 异常体系的系统总结:
一、异常的本质与作用
本质:程序执行过程中发生的非预期情况(如文件不存在、数组越界等)。
作用:

  • 分离正常业务逻辑与错误处理代码。
  • 提供错误的详细信息(类型、位置、原因)。
  • 避免程序因错误直接崩溃,提高健壮性。

二、异常体系结构
Java 异常以类的形式存在,核心继承关系如下:

Object
└── Throwable(所有异常的根类)
    ├── Error(错误,虚拟机层面,无法处理)
    │   ├── OutOfMemoryError(内存溢出)
    │   ├── StackOverflowError(栈溢出)
    │   └── NoClassDefFoundError(类未找到)
    │
    └── Exception(异常,程序层面,可处理)
        ├── RuntimeException(运行时异常,非检查型)
        │   ├── NullPointerException(空指针)
        │   ├── IndexOutOfBoundsException(索引越界)
        │   ├── ClassCastException(类型转换错误)
        │   └── ArithmeticException(算术错误,如除0)
        │
        └── 非RuntimeException(编译时异常,检查型)
            ├── IOException(IO操作异常)
            ├── SQLException(数据库操作异常)
            └── ParseException(解析异常,如日期格式错误)

三、异常的分类
根据处理时机分为两类:
1、检查型异常(Checked Exception)

  • 非 RuntimeException 的 Exception 子类(如 IOException)。
  • 特点:编译期强制检查,必须显式处理(try-catch 捕获或 throws 声明抛出)。
  • 场景:可预见的外部错误(如文件读写、网络请求)。

2、非检查型异常(Unchecked Exception)

  • 包括 RuntimeException 及其子类和 Error。
  • 特点:编译期不检查,无需显式处理(可选择性捕获)。
  • 场景:运行时异常:程序逻辑错误(如空指针、数组越界)。错误(Error):虚拟机无法解决的严重问题(如内存溢出),通常无需处理。

四、异常处理机制
核心关键字:try、catch、finally、throw、throws。

  1. 捕获异常(try-catch-finally)
try {
    // 可能发生异常的代码
    int result = 10 / 0;
} catch (ArithmeticException e) {
    // 捕获特定异常并处理
    System.out.println("处理除0异常:" + e.getMessage());
} finally {
    // 无论是否发生异常,都会执行(通常用于释放资源)
    System.out.println("执行finally块");
}
  1. 抛出异常(throw/throws)
  • throw:在方法内手动抛出异常对象。
  • throws:在方法声明处声明可能抛出的异常类型。
public void readFile(String path) throws IOException {
    if (path == null) {
        throw new IllegalArgumentException("文件路径不能为空");
    }
    // 可能抛出IOException的代码
}

五、自定义异常
当系统异常无法满足业务需求时,可自定义异常类:

// 自定义检查型异常(继承Exception)
class FileFormatException extends Exception {
    public FileFormatException(String message) {
        super(message); // 调用父类构造方法
    }
}

// 自定义非检查型异常(继承RuntimeException)
class UserNotFoundException extends RuntimeException {
    public UserNotFoundException(String message) {
        super(message);
    }
}

使用场景:业务特定错误(如用户不存在、订单状态异常)

六、异常处理最佳实践

  1. 避免捕获所有异常:不要直接捕获 Exception 或 Throwable,应捕获具体异常。
  2. 避免空 catch 块:空块会隐藏错误,至少记录日志。
  3. 资源释放放在 finally 中:如文件流、数据库连接等必须确保关闭。
  4. 异常信息要具体:包含足够上下文(如 “用户 ID=123 不存在” 而非 “错误”)。
  5. 区分检查型与非检查型:
  • 检查型:外部依赖错误(如 IO、网络),调用者必须处理。
  • 非检查型:程序逻辑错误(如参数非法),应通过代码修复避免。
  1. 不要滥用异常:异常用于处理异常情况,不应用于控制正常业务流程。
posted @ 2025-09-30 21:22  倔强的老铁  阅读(16)  评论(0)    收藏  举报