Java异常处理核心是理解Throwable体系与执行机制:Error不可恢复,Exception分checked(强制处理)和unchecked(编程错误);try-catch-finally固定顺序执行,finally必执行(除非JVM退出),其中return会覆盖原返回值;资源管理优先用try-with-resources。

Java 异常处理是大厂面试高频考点,核心不是背定义,而是能说清“什么时候该抛、怎么捕、为何这样设计”。重点考察你对异常分类、JVM行为、API设计逻辑的理解,以及真实场景下的取舍能力。
搞懂 Throwable 体系的分层逻辑
Throwable 是所有异常和错误的根类,它下面只分两支:Error 和 Exception。Error 表示 JVM 无法恢复的问题(如 OutOfMemoryError),程序一般不捕获;Exception 又分 checked(编译期强制处理)和 unchecked(运行时异常,如 NullPointerException)。关键要讲清:checked 异常代表“可预期但必须声明的外部问题”(比如 IO 中断、文件不存在),而 unchecked 异常代表“编程错误或不可控的运行时状态”,不该用 try-catch 吞掉,而应修复逻辑或提前校验。
try-catch-finally 的执行顺序与资源管理
面试常问 finally 一定会执行吗?答案是:除非 System.exit()、JVM 崩溃、线程被 kill,否则一定执行。更关键的是:不要在 finally 里 return 或 throw,会掩盖原异常。现代写法优先用 try-with-resources(要求资源实现 AutoCloseable),它自动调用 close(),且能正确处理多个异常(主异常保留,suppressed 异常附加)。例如:
try (FileInputStream fis = new FileInputStream("a.txt")) {
// 读取操作
} catch (IOException e) {
// 处理 IO 异常
}
立即学习“Java免费学习笔记(深入)”;
自定义异常该怎么设计才专业
别一上来就 extends Exception。先想清楚:这是业务场景下需要显式通知调用方的可恢复问题(选 checked),还是属于非法参数、状态冲突等应该快速失败的逻辑错误(选 RuntimeException)。命名要见名知意(如 InsufficientBalanceException、InvalidOrderStatusException),构造器建议至少提供 String message 和 Throwable cause 两个重载,并在文档中说明触发条件和建议处理方式。避免泛泛而谈“系统异常”,要绑定具体业务语义。
常见陷阱题怎么答出区分度
- “catch(Exception e) {}” —— 错!吞异常等于埋雷,至少要 log.error("xxx", e)
- “在 service 层 catch 数据库异常后转成统一返回码” —— 要分情况:底层 DAO 抛出 DataAccessException(Spring 封装的 unchecked),service 不该再 catch,而应在 controller 层统一拦截处理;若需转换业务含义,用 throws 声明并让上层决策
- “finally 里修改了 return 值?” —— 基本类型会被覆盖,引用类型内容可能被改,但返回对象本身不会变;真正影响返回值的是 finally 中的 return 语句


















