java异常体系以throwable为根,分error(jvm级不可恢复错误,如outofmemoryerror,不应捕获)和exception;后者再分为受检异常(编译强制处理,如ioexception)与非受检异常(继承runtimeexception,如nullpointerexception,应通过代码规范预防)。

Java异常处理面试题重在理解体系结构和实操逻辑,不是背答案。核心是说清楚“谁抛、谁捕、谁管、谁不该碰”。
搞懂异常分类的三层结构
Throwable 是根,下面分两支:
- Error:JVM级问题,比如 OutOfMemoryError、StackOverflowError。程序不该 catch,更不该 try-catch 吞掉——它意味着系统已不可靠,应让应用快速失败,而非假装正常
-
Exception:程序级问题,再分两类:
- 受检异常(Checked):编译器强制处理,如 IOException、SQLException。它们代表外部不确定性(文件可能不存在、网络可能断开),必须显式 try-catch 或 throws
- 非受检异常(Unchecked):即 RuntimeException 及其子类,如 NullPointerException、ArrayIndexOutOfBoundsException。编译器不管,但暴露的是代码逻辑缺陷,应通过校验、防御式编程来避免,而不是依赖 catch
掌握 try-catch-finally 的真实行为
别死记“finally 总执行”,要明白它在什么情况下不生效:
- try 或 catch 中调用 System.exit(0),JVM 直接终止,finally 被跳过
- 线程被强制中断(Thread.stop 已废弃,但极端场景下仍可能)
- 发生致命 Error(如 OutOfMemoryError),JVM 可能来不及执行 finally
- 正常流程下(包括 try 抛异常、catch 捕获后 return、甚至 catch 里再 throw),finally 都会执行——这是资源释放(如关闭流、释放锁)的可靠位置
写出让人信服的异常处理代码
面试官常给一段有隐患的代码,让你改。关键不是语法对,而是体现工程意识:
- catch Exception e { } —— ❌ 空 catch 是大忌,至少 log.error("xxx failed", e)
- 多个 catch 顺序错乱 —— ✅ 先捕具体(NumberFormatException),再捕泛化(IllegalArgumentException),否则后者永远不触发
- 资源未自动关闭 —— ✅ JDK7+ 优先用 try-with-resources(FileInputStream、Connection 等 AutoCloseable 类型),比手写 finally 更安全
- 自定义业务异常 —— ✅ 继承 RuntimeException,带清晰错误码和消息,避免滥用通用异常掩盖业务语义
避开高频陷阱回答
遇到“final、finally、finalize 区别”这类题,直击本质:
- final:修饰符,修饰类(不可继承)、方法(不可重写)、变量(不可变引用)
- finally:异常处理结构的一部分,保证清理逻辑执行,与异常是否发生无关
- finalize:Object 方法,已被标记为 deprecated(自 Java 9 起),GC 不保证调用时机,绝不用于资源释放;现代替代方案是 Cleaner 或 try-with-resources
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











