异常体系
约 647 字大约 2 分钟
2025-09-04
异常的分类
在 Java 中,所有的异常都继承自 java.lang.Throwable 类。Throwable 主要分为两大类:Error 和 Exception。
根据 Java 编译器的强制处理要求,异常又可分为 Checked Exception(受检查异常)和 Unchecked Exception(非受检查异常)。
| 异常类型 | 分类 | 强制处理要求 |
|---|---|---|
Error 及其子类 | unchecked | 无需声明或捕获 |
RuntimeException 及其子类 | unchecked | 无需声明或捕获 |
Exception(除 RuntimeException 外)及其子类 | checked | 必须声明或捕获(否则编译失败) |
Error 和 Exception 的区别
在 Java 中,Error 和 Exception 都继承自 Throwable 类,用于表示程序运行过程中可能出现的问题。它们的主要区别如下:
本质和来源
Error: 表示程序运行中遇到的系统级严重问题,通常是 JVM 无法处理的,是内部错误或资源耗尽等。这些问题超出了应用程序的控制和处理能力。Exception: 表示程序运行中遇到的程序级问题,通常是由于程序逻辑错误、不合法操作或外部因素(如 I/O 问题)导致的。这些问题是应用程序可以预见并尝试处理的。
可恢复性
Error: 通常是不可恢复的。当Error发生时,应用程序往往无法继续正常运行,只能选择终止。例如,OutOfMemoryError(内存溢出)或StackOverflowError(栈溢出)。Exception: 通常是可恢复的。应用程序可以通过try-catch语句捕获并处理Exception,从而使程序能够从错误中恢复或优雅地关闭,而不会导致程序立即崩溃。
处理方式
Error: 不建议在代码中捕获和处理Error。捕获Error往往是徒劳的,因为它表明系统处于一个不稳定的状态,即使捕获也无法有效解决根本问题。Exception: 鼓励在代码中捕获和处理Exception。通过try-catch-finally结构,程序可以对异常情况进行适当的响应,例如记录日志、回滚事务、向用户显示友好的错误信息或重试操作。
示例
Error示例:java.lang.OutOfMemoryError: JVM 内存不足。java.lang.StackOverflowError: 线程栈空间耗尽。java.lang.NoClassDefFoundError: 编译时存在但在运行时找不到类定义。
Exception示例:java.io.FileNotFoundException: 尝试访问一个不存在的文件。java.lang.NullPointerException: 尝试在null对象上调用方法。java.lang.IllegalArgumentException: 方法接收到非法或不适当的参数。java.sql.SQLException: 数据库访问错误。