Error 和 Exception 的区别;CheckedException、RuntimeException 的区别¶
一、Throwable 体系¶
二、Error vs Exception¶
Error¶
JVM 层面的严重问题,程序自身无法恢复:
OutOfMemoryErrorStackOverflowErrorNoClassDefFoundErrorVirtualMachineError
不要 catch Error,通常直接退出 JVM。
Exception¶
程序可以处理的异常。
三、Checked vs Unchecked¶
Checked Exception(受检异常)¶
编译期检查,必须 catch 或 throws:
IOExceptionSQLExceptionClassNotFoundException
RuntimeException(非受检异常)¶
编译期不强制 catch:
NullPointerExceptionIllegalArgumentExceptionIndexOutOfBoundsExceptionClassCastException
四、对比¶
| Checked | RuntimeException | Error | |
|---|---|---|---|
| 编译期检查 | ✅ | ❌ | ❌ |
| 能否恢复 | 可 | 通常可 | 不可 |
| 例子 | IOException | NPE | OOM |
| 处理 | try-catch 或 throws | 编程避免 | 记录日志退出 |
五、为什么有受检异常¶
强制调用者处理异常情况。但实际开发中,受检异常被诟病:
- 方法签名 throws 一堆,调用者麻烦。
- 很多异常 catch 了也不知道怎么办。
- Spring 把受检异常转成 RuntimeException。
六、实战建议¶
- 业务异常用 RuntimeException 子类。
- 不要 catch Throwable。
- 不要 catch Error。
高频追问
- RuntimeException 也叫 unchecked。
- Error 不需要 throws 声明。
- main 方法 throws Exception 只是偷懒,不推荐。