大家好,我是程序员二叉。


简介

本文汇总Java异常面试必考知识点,区分Error与Exception、throw/throws用法、try-catch-finally执行逻辑、finally特殊坑点、两种类找不到异常、栈溢出与堆溢出原理,干货精炼,适合面试背诵与日常开发查阅。欢迎点赞关注收藏。


一、Error 和 Exception 的区别

二者都继承自Throwable

  1. Error:JVM级系统错误,程序无法捕获、无法修复,由虚拟机抛出。
  2. Exception:程序业务异常,可捕获处理,是开发中重点关注的异常。

二、常见Error与Exception

1. 常见Error

  • OutOfMemoryError:堆内存溢出
  • StackOverflowError:虚拟机栈溢出
  • NoClassDefFoundError:运行时缺失编译存在的类
  • NoSuchMethodError:方法缺失(依赖版本冲突)

2. 常见Exception

运行时异常(RuntimeException,非受检)
  • NullPointerException空指针、IndexOutOfBoundsException数组越界
  • ClassCastException类型强转异常、ArithmeticException除零异常
  • IllegalArgumentException非法参数
受检异常(编译必须捕获/抛出)
  • IOExceptionSQLExceptionFileNotFoundExceptionClassNotFoundException

三、throw 和 throws 的区别

  1. throws:写在方法声明处,声明本方法可能抛出异常,支持多个异常。
public void test() throws IOException{}

2.throw:写在方法内部,手动抛出单个异常实例。

throw new RuntimeException("参数错误");

四、try-catch-finally 执行顺序

  1. 正常无异常:try → finally
  2. 出现异常:try → catch → finally

五、finally 代码一定执行吗?

不一定,下述场景 finally 不会执行:

  1. try 中执行System.exit(0)退出 JVM
  2. JVM 进程崩溃、操作系统宕机
  3. 执行线程被暴力终止

六、finally 中写 return 的问题

  1. finally 的 return 会覆盖 try/catch 的 return 返回值;
  2. 会屏蔽代码抛出的异常,异常被吞掉无法向外抛出;

开发规范:禁止在 finally 中使用 return。


七、NoClassDefFoundError 和 ClassNotFoundException 区别

  1. ClassNotFoundException:受检异常,手动Class.forName/ClassLoader.loadClass动态加载类找不到;
  2. NoClassDefFoundError:Error,编译期类存在,运行期 class 文件缺失、依赖缺失。

八、OutOfMemoryError & StackOverflowError 成因

  1. StackOverflowError:虚拟机栈,无限递归无终止条件、方法调用层级过深,栈帧塞满;
  2. OutOfMemoryError:Java 堆,大量创建对象无法 GC 回收、内存泄漏、一次性加载超大批量数据。

总结

  1. 异常顶层父类为Throwable,分为不可处理的Error和可捕获处理的Exception
  2. throws声明异常、throw手动抛出异常;finally绝大多数情况执行,禁用 return;
  3. 类找不到分两种:手动加载异常ClassNotFoundException、运行时类丢失错误NoClassDefFoundError
  4. 栈溢出多是无限递归,堆溢出多是对象过多无法回收,是线上故障高频类型。

更多推荐