Java面试题更新 2026-08-05

在Java中,Exception和Error在继承关系、语义定位和处理要求上有哪些区别?请分别说明它们的主要子类分类和典型场景。

技术原理Java

考察说明

考查对Java异常体系结构的本质理解,包括两个顶层子类的设计目的和实际使用时的处理差异。

回答思路

  1. 【回答框架 1】从继承结构出发,Exception与Error都继承自Throwable,但Error代表JVM层面的严重问题,如OutOfMemoryError、StackOverflowError,通常无法恢复,程序不应捕获处理;Exception代表程序运行中可预料的异常状况,如IOException、NullPointerException,设计上鼓励开发者处理。
  2. 【回答框架 2】按Java规范,Exception分为受检异常和非受检异常。受检异常(如FileNotFoundException)在编译阶段强制要求捕获或声明抛出;非受检异常即RuntimeException及其子类(如NullPointerException、 IllegalArgumentException)不强制处理,运行时抛出。
  3. 【回答框架 3】处理机制上,受检异常必须体现try-catch或throws,否则编译失败;非受检异常和Error虽然可以用try-catch捕获,但一般不建议针对Error捕获,因为恢复意义有限。
  4. 【回答框架 4】实践中,应针对受检异常编写恢复代码或记录日志,对RuntimeException应通过代码逻辑避免并可能转换为业务异常,对Error应记录现场并停机排查,而非尝试无限重试。
  5. 【关键点 1】二者都继承Throwable,Error表示JVM级错误,通常不该捕获;Exception表示程序级异常,需要处理。
  6. 【关键点 2】受检异常编译期强制处理,RuntimeException及其子类为非受检异常,不强制处理。
  7. 【关键点 3】捕获Error无太大意义且可能掩盖严重问题,一般不捕获。
  8. 【关键点 4】代码中应优先处理受检异常,合理设计RuntimeException的抛出与转换。
  9. 【易错点 1】误将catch Exception捕获所有,可能掩盖进程需退出的Error或程序性错误。
  10. 【易错点 2】把受检异常和非受检异常的处理方式混为一谈,造成代码不健壮。
  11. 【易错点 3】误认为Error绝对不能捕获,在特殊场景下(如自定义线程池)也可捕获但需谨慎。