初识JAVA:Java异常种类
Java 异常(Exception)体系详解
在 Java 中,异常是程序运行过程中出现的错误或异常情况。Java 提供了强大的异常处理机制,通过继承 Throwable
类来实现。
一、Java 异常体系结构图
Throwable
├── Error // 系统级错误,不可捕获或处理
└── Exception // 可处理的异常├── RuntimeException // 运行时异常(非检查型)└── 其他Exception // 检查型异常(Checked Exceptions)
二、异常分类详解
1. Error
(错误)
- 定义:表示 JVM 无法恢复的严重问题,通常与编译、系统资源相关。
- 特点:
- 不需要也不建议捕获;
- 常见于虚拟机崩溃、内存溢出等;
- 示例:
OutOfMemoryError
StackOverflowError
NoClassDefFoundError
⚠️ 注意:这些错误一般由系统抛出,应用程序不应该尝试捕获它们。
2. Exception
(异常)
- 定义:代表程序可以捕获和处理的问题。
- 子类划分:
- 运行时异常(RuntimeException)
- 非运行时异常(受检异常 / Checked Exceptions)
3. RuntimeException
(运行时异常)
- 定义:程序运行期间发生的异常,通常由于代码逻辑错误导致。
- 特点:
- 不强制要求使用 try-catch 或 throws 声明;
- 出现频率高,若强制检查会影响性能;
- 常见类型:
异常类 | 描述 |
---|---|
ArithmeticException | 算术异常,如除以零 |
NullPointerException | 空指针异常,访问 null 对象的方法或属性 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
ClassCastException | 类型转换异常 |
NumberFormatException | 字符串转数字失败 |
IllegalArgumentException | 非法参数异常 |
✅ 建议:虽然不强制捕获,但应在编码中尽量避免此类异常的发生。
4. 非运行时异常(Checked Exceptions / 受检异常)
- 定义:编译器会强制要求处理的异常。
- 特点:
- 必须显式捕获 (
try-catch
) 或声明抛出 (throws
); - 表示程序外部环境可能引发的问题;
- 必须显式捕获 (
- 常见类型:
异常类 | 描述 |
---|---|
IOException | 输入输出异常,如读写文件失败 |
FileNotFoundException | 文件未找到 |
EOFException | 文件读取结束时仍然尝试读取 |
SQLException | 数据库操作异常 |
ClassNotFoundException | 类找不到异常 |
InterruptedException | 线程被中断异常 |
✅ 建议:必须进行异常处理,否则程序无法编译通过。
三、自定义异常(User-defined Exceptions)
Java 允许开发者根据业务需求创建自己的异常类,通常是继承 Exception
或 RuntimeException
。
示例:自定义异常类
public class MyCustomException extends Exception {public MyCustomException(String message) {super(message);}
}
使用方式:
public void checkAge(int age) throws MyCustomException {if (age < 18) {throw new MyCustomException("年龄必须大于18岁");}
}
四、Java 异常处理机制关键词
关键词 | 作用 |
---|---|
try | 包含可能抛出异常的代码块 |
catch | 捕获并处理异常 |
finally | 无论是否发生异常都会执行的代码块 |
throw | 主动抛出一个异常对象 |
throws | 在方法签名中声明该方法可能抛出的异常 |
五、总结表格对比
分类 | 是否检查 | 是否强制处理 | 常见例子 | 是否建议捕获 |
---|---|---|---|---|
Error | 否 | 否 | OutOfMemoryError | ❌ 不建议 |
RuntimeException | 否 | 否 | NullPointerException | ✅ 建议处理 |
Checked Exceptions | 是 | 是 | IOException, SQLException | ✅ 必须处理 |
六、最佳实践建议
- 优先捕获具体的异常类型,而不是笼统地捕获
Exception
; - 不要忽略异常,空 catch 块会导致调试困难;
- 合理使用 finally 来释放资源(如关闭 IO 流);
- 自定义异常应有意义,便于日志记录和排查问题;
- 在接口设计中明确声明异常,提高 API 的可维护性。