Java异常/错误体系简介
所有异常和错误的根都是 Throwable
类。它有两个主要的子类:
Error
(错误): 表示严重问题,通常是JVM层面或系统级的,应用程序不应该(也通常无法)捕获和处理。例如OutOfMemoryError
。Exception
(异常): 表示可以被应用程序捕获和处理的问题。它又分为:- Checked Exception (检查异常): 编译器会强制要求你必须处理(
try-catch
或throws
)的异常,如IOException
,SQLException
。 - Unchecked Exception (非检查异常 / 运行时异常): 继承自
RuntimeException
的异常,编译器不强制要求处理,通常由程序逻辑错误引起,如NullPointerException
。
- Checked Exception (检查异常): 编译器会强制要求你必须处理(
现在,让我们基于这个理解,按照后端开发的常见场景进行分类。
Java 常见异常分类列表
1. 基础运行时异常 (Unchecked Exceptions)
这类异常通常由程序自身的逻辑错误引起,属于 RuntimeException
的子类,编译器不强制捕获。
异常类 | 中文含义 | 常见触发场景 |
---|---|---|
NullPointerException | 空指针异常 | 调用一个 null 对象的实例方法或访问其字段。 |
IllegalArgumentException | 非法参数异常 | 向方法传递了一个不合法或不适当的参数。 |
NumberFormatException | 数字格式化异常 | 试图将一个非数字格式的字符串转换为数字类型。 |
ArrayIndexOutOfBoundsException | 数组索引越界异常 | 使用了小于0或大于等于数组长度的索引来访问数组。 |
ArithmeticException | 算术异常 | 出现异常的算术条件,例如整数除以零。 |
ClassCastException | 类型转换异常 | 试图将一个对象强制转换为它并非其实例的子类。 |
IllegalStateException | 非法状态异常 | 在不适当的时间或状态下调用了对象的方法。 |
ConcurrentModificationException | 并发修改异常 | 在使用迭代器遍历集合时,该集合的结构被其他线程或代码修改。 |
2. I/O 与类加载异常 (Checked Exceptions)
这类异常通常与外部资源交互(如文件、网络)或类的动态加载有关,属于检查异常,编译器会强制要求处理。
异常类 | 中文含义 | 常见触发场景 |
---|---|---|
IOException | 输入/输出异常 | 所有I/O操作失败的通用父类异常(如文件读写、网络流中断)。 |
FileNotFoundException | 文件未找到异常 | 试图打开一个不存在的文件进行读写操作。 |
ClassNotFoundException | 类未找到异常 | 在运行时通过字符串加载类(Class.forName() )时,找不到对应的类文件。 |
SQLException | SQL异常 / 数据库异常 | 所有通过JDBC与数据库交互时发生的错误的父类。 |
InterruptedException | 中断异常 | 一个正在休眠、等待或被阻塞的线程被另一个线程中断。 |
3. 反射相关异常 (Mostly Checked Exceptions)
这类异常专门用于处理Java反射机制中可能出现的各种问题。
异常类 | 中文含义 | 常见触发场景 |
---|---|---|
NoSuchMethodException | 方法未找到异常 | 试图获取一个不存在的方法(方法名或参数列表不匹配)。 |
IllegalAccessException | 非法访问异常 | 试图通过反射访问或修改一个无权访问的字段或方法(如 private )。 |
InstantiationException | 实例化异常 | 试图通过反射实例化一个接口、抽象类或没有无参构造函数的类。 |
InvocationTargetException | 调用目标异常 | 通过反射调用的方法或构造函数其内部本身抛出了一个异常。 |
4. JVM 错误 (Errors)
这类问题非常严重,通常表示JVM资源耗尽或发生了不可恢复的错误,应用程序一般无法处理。
错误类 | 中文含义 | 常见触发场景 |
---|---|---|
StackOverflowError | 栈溢出错误 | 方法调用层次太深(如无限递归),导致线程栈空间耗尽。 |
OutOfMemoryError | 内存溢出错误 | JVM无法为新对象分配足够的堆内存空间,并且垃圾回收也无能为力。 |