java异常处理的核心是三层逻辑:异常“是什么”(throwable派生error与exception,后者分受检/非受检)、“怎么用”(try-catch-finally及try-with-resources的执行细节)、“怎么想”(如受检异常强制暴露风险、避免catch exception、throw与throws语义区分、自定义异常封装业务意图并保留根因)。

准备Java异常处理面试题,关键是理清三层逻辑:异常“是什么”(概念与分类)、“怎么用”(语法与写法)、“怎么想”(设计原则与避坑)。不需要死记硬背答案,抓住主线就能应对绝大多数问题。
先搞懂异常体系的骨架
所有异常都源于 Throwable,它有两个子类:Error 和 Exception。
-
Error 是系统级错误,比如
OutOfMemoryError、StackOverflowError。程序不该捕获或处理它,JVM 都扛不住,你更不用硬刚。 -
Exception 才是你要打交道的对象,又分两类:
-
受检异常(Checked):编译器强制你管,比如
IOException、SQLException。不 try-catch 或 throws,代码直接编译失败。 -
非受检异常(Unchecked):也就是
RuntimeException及其子类,比如NullPointerException、ArrayIndexOutOfBoundsException。编译器不管,但一出就崩——根源在逻辑漏洞,得改代码,不是加 catch 就能糊弄过去。
-
受检异常(Checked):编译器强制你管,比如
掌握 try-catch-finally 的真实行为
别只背“finally 总会执行”,要理解边界情况:
- try 或 catch 里有
return,finally 仍会在方法真正返回前执行; - 但如果在 try/catch 里调用了
System.exit(0),finally 就跳过了; - 线程被中断、JVM 崩溃,finally 也救不了;
- 资源管理优先用 try-with-resources(JDK7+),自动关闭实现了
AutoCloseable的对象,比手写 finally 更安全简洁。
回答时体现设计意识,不是罗列语法
面试官想听你怎么思考,不是复述 API 文档:
- 问“为什么要有受检异常?”——答:它把“外部不确定性”显式暴露出来,强迫开发者面对 IO、数据库等不可控环节,避免静默失败;
- 问“catch(Exception e) 好不好?”——答:不好。它会吞掉本该向上抛的 RuntimeException,掩盖真正 bug;应该捕获最具体的类型,比如先
catch(FileNotFoundException),再catch(IOException); - 问“throw 和 throws 区别?”——答:
throw是抛出一个异常对象(动词),throws是声明方法可能甩锅(形容词),只对受检异常有意义,RuntimeException 不需要声明。
自定义异常和封装异常的实用场景
这不是炫技,而是工程落地的关键:
- 业务系统常统一定义
BizException,把底层SQLException或HttpClientException封装成带业务码和提示语的异常,前端好解析,日志好归因; - 封装时用
initCause()或构造函数传入原异常,保留原始堆栈,调试时不丢关键线索; - 自定义异常一般只需两个构造器:无参 + 带 message 的,够用且符合 JDK 风格。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











