java异常体系以throwable为根,分error(不可捕获)和exception;后者再分受检异常(编译强制处理)和运行时异常(需代码规避);try-catch-finally执行逻辑、try-with-resources、throw/throws区别及自定义异常是核心考点。

Java异常处理是面试高频考点,看百问百答类资料不能只扫答案,关键要抓住逻辑主线和易错点。
先理清异常体系的骨架
Throwable是根,下面分Error和Exception。Error是JVM级问题,比如OutOfMemoryError、StackOverflowError,程序不该也不必捕获。Exception才是你该关注的——它又分两类:受检异常(Checked)和运行时异常(Unchecked)。前者如IOException、SQLException,编译器强制你处理(try-catch或throws);后者如NullPointerException、ArrayIndexOutOfBoundsException,编译器不管,但出错了程序就崩,得靠写代码规避。
重点盯住 try-catch-finally 的行为细节
- try里一旦抛异常,后续代码不执行,直接跳到匹配的catch
- catch按顺序从上到下匹配,子类异常必须写在父类前面(比如NullPointerException要放在Exception前面),否则编译报错
- finally无论有没有异常、有没有return,都一定执行(哪怕try里return了,也是先存返回值,再进finally,最后才返回)
- 如果catch里又抛新异常,或者finally里有return,会覆盖原返回值——这点常被问,也最容易踩坑
别忽略现代写法和资源管理
JDK 7起支持try-with-resources,自动关闭实现了AutoCloseable的资源(如FileInputStream、Connection)。比起老式try-catch-finally手动close,它更简洁、更安全,面试官常会对比两者优劣。写法是:
try (FileInputStream fis = new FileInputStream("a.txt")) {
// 使用fis
} catch (IOException e) {
// 处理异常
}
自定义异常和throw/throws要分清用途
- throw用在方法内部,手动抛出一个异常对象(比如参数校验失败时throw new IllegalArgumentException("id不能为空"))
- throws写在方法声明后,告诉调用方“我可能抛这个异常,你看着办”,只对受检异常有意义;运行时异常加不加throws都不影响编译
基本上就这些。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











