【Java】异常机制高频面试总结|Error、Exception、finally、OOM全梳理
大家好我是程序员二叉。简介本文汇总Java异常面试必考知识点区分Error与Exception、throw/throws用法、try-catch-finally执行逻辑、finally特殊坑点、两种类找不到异常、栈溢出与堆溢出原理干货精炼适合面试背诵与日常开发查阅。欢迎点赞关注收藏。一、Error 和 Exception 的区别二者都继承自Throwable。ErrorJVM级系统错误程序无法捕获、无法修复由虚拟机抛出。Exception程序业务异常可捕获处理是开发中重点关注的异常。二、常见Error与Exception1. 常见ErrorOutOfMemoryError堆内存溢出StackOverflowError虚拟机栈溢出NoClassDefFoundError运行时缺失编译存在的类NoSuchMethodError方法缺失依赖版本冲突2. 常见Exception运行时异常(RuntimeException非受检)NullPointerException空指针、IndexOutOfBoundsException数组越界ClassCastException类型强转异常、ArithmeticException除零异常IllegalArgumentException非法参数受检异常(编译必须捕获/抛出)IOException、SQLException、FileNotFoundException、ClassNotFoundException三、throw 和 throws 的区别throws写在方法声明处声明本方法可能抛出异常支持多个异常。publicvoidtest()throwsIOException{}2.throw写在方法内部手动抛出单个异常实例。thrownewRuntimeException(参数错误);四、try-catch-finally 执行顺序正常无异常try → finally出现异常try → catch → finally五、finally 代码一定执行吗不一定下述场景 finally 不会执行try 中执行System.exit(0)退出 JVMJVM 进程崩溃、操作系统宕机执行线程被暴力终止六、finally 中写 return 的问题finally 的 return 会覆盖 try/catch 的 return 返回值会屏蔽代码抛出的异常异常被吞掉无法向外抛出开发规范禁止在 finally 中使用 return。七、NoClassDefFoundError 和 ClassNotFoundException 区别ClassNotFoundException受检异常手动Class.forName/ClassLoader.loadClass动态加载类找不到NoClassDefFoundErrorError编译期类存在运行期 class 文件缺失、依赖缺失。八、OutOfMemoryError StackOverflowError 成因StackOverflowError虚拟机栈无限递归无终止条件、方法调用层级过深栈帧塞满OutOfMemoryErrorJava 堆大量创建对象无法 GC 回收、内存泄漏、一次性加载超大批量数据。总结异常顶层父类为Throwable分为不可处理的Error和可捕获处理的Exceptionthrows声明异常、throw手动抛出异常finally绝大多数情况执行禁用 return类找不到分两种手动加载异常ClassNotFoundException、运行时类丢失错误NoClassDefFoundError栈溢出多是无限递归堆溢出多是对象过多无法回收是线上故障高频类型。