在 Java 中,Exception 和 Error 都是 Throwable 类的直接子类,是 Java 异常处理机制的核心组成部分。它们代表程序运行过程中可能出现的不同类型的“异常情况”,但用途、严重程度和处理方式有本质区别。
文章目录
- `Error`:JVM 或系统级严重错误
- 特点:
- `Exception`:程序可处理的异常
- 特点:
- 一、常见Error
- 1. **OutOfMemoryError(内存溢出错误)**
- 2. **StackOverflowError(栈溢出错误)**
- 3. **NoClassDefFoundError(找不到类定义错误)**
- 二、常见的受检异常
- 1. **IOException(输入输出异常)**
- 2. **SQLException(SQL 数据库访问异常)**
- 3. **ClassNotFoundException**
- 三、常见的运行时异常
- 1. **NullPointerException(空指针异常)**
- 2. **ArrayIndexOutOfBoundsException(数组越界异常)**
- 3. **IllegalArgumentException(非法参数异常)**
Error:JVM 或系统级严重错误
特点:
- 表示应用程序无法处理的严重问题;
- 通常由JVM 自身故障、资源耗尽或底层系统崩溃引起;
- 不期望被应用程序捕获或恢复(即使技术上可以
catch); - 属于非受检(Unchecked)—— 编译器不要求处理。
Exception:程序可处理的异常
特点:
- 表示程序运行中可能出现的、合理的异常情况;
- 应用程序应该预期并处理这些异常;
- 分为两类:
- 受检异常(Checked Exception)
- 非受检异常(Unchecked Exception) = RuntimeException 及其子类
一、常见Error
1.OutOfMemoryError(内存溢出错误)
- 原因:JVM 没有足够的内存来完成操作。
- 常见场景:
- 堆内存不足(
Java heap space):对象太多,GC 无法回收。 - 永久代/元空间不足(
Metaspace或PermGen space):加载了太多类。 - 直接内存不足(
Direct buffer memory):使用ByteBuffer.allocateDirect()过多。 - 栈内存不足(较少见,通常表现为
StackOverflowError)。
- 堆内存不足(
2.StackOverflowError(栈溢出错误)
- 原因:线程调用栈深度过大,通常是无限递归导致。
- 特点:每个方法调用都会占用栈帧,递归太深会耗尽栈空间。
3.NoClassDefFoundError(找不到类定义错误)
- 原因:JVM 在运行时尝试加载某个类时,该类在编译时存在,但运行时找不到。
- 常见原因:
- 类路径(classpath)缺失 JAR 包;
- 静态初始化块抛出异常,导致类加载失败;
- 依赖的类被删除或重命名。
- 注意:不同于
ClassNotFoundException(属于Exception),NoClassDefFoundError是Error,发生在已经成功加载过类之后再次使用时找不到。
二、常见的受检异常
1.IOException(输入输出异常)
- 包:
java.io - 用途:表示 I/O 操作失败,如文件读写、网络通信等。
- 常见子类:
FileNotFoundException:试图打开不存在的文件。EOFException:读取到数据末尾(用于对象流等)。SocketTimeoutException:网络超时。
2.SQLException(SQL 数据库访问异常)
- 包:
java.sql - 用途:JDBC 操作数据库时发生错误(如连接失败、SQL 语法错误、权限不足等)。
- 特点:几乎所有 JDBC 方法都声明抛出此异常。
3.ClassNotFoundException
- 包:
java.lang - 用途:通过字符串动态加载类时(如
Class.forName()),指定的类在 classpath 中找不到。 - 注意:与
NoClassDefFoundError(Error)不同,这是受检异常,发生在“主动加载类”的时候。
三、常见的运行时异常
1.NullPointerException(空指针异常)
- 原因:试图访问一个
null对象的成员(方法、字段等)。 - 最常见、最经典的运行时异常。
2.ArrayIndexOutOfBoundsException(数组越界异常)
- 原因:访问数组时下标超出
[0, length - 1]范围。
3.IllegalArgumentException(非法参数异常)
- 原因:向方法传递了不合法或不合适的参数。
- 常用于 API 设计中主动校验参数。