【Java】 异常高频面试题精讲 | 易错点+对比总结

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


简介

本文整理Java异常体系高频面试考点,涵盖Error与Exception区分、常用异常、throw/throws、try-catch-finally执行逻辑、经典异常辨析等内容,知识点精简易懂,适合面试复习与日常学习查阅。欢迎点赞收藏关注。


1. Error 和 Exception 的区别

核心区别

  • Error :JVM 层面严重错误,程序无法捕获、无法恢复,出现后程序直接崩溃。
  • Exception :程序逻辑/运行时异常,可捕获、可处理、可恢复,是开发重点处理对象。

继承关系

二者均直接继承自 Throwable

  • Error:包含虚拟机错误、类链接错误等
  • Exception:分为受检异常(编译异常)非受检异常(运行时异常)

2. 常见的 Error / Exception

常见 Error(不可处理)

  1. OutOfMemoryError:内存溢出
  2. StackOverflowError:栈溢出
  3. NoClassDefFoundError:类定义缺失
  4. NoSuchMethodError:方法不存在
  5. LinkageError:类链接错误

常见 Exception(可处理)

非受检异常(RuntimeException,无需强制捕获)
  1. NullPointerException:空指针异常
  2. IndexOutOfBoundsException:下标越界
  3. IllegalArgumentException:非法参数
  4. ClassCastException:类型转换异常
  5. ArithmeticException:算术异常(除零等)
受检异常(编译异常,必须捕获或抛出)
  1. IOException:IO 流异常
  2. SQLException:数据库异常
  3. ClassNotFoundException:类未找到
  4. FileNotFoundException:文件未找到

3. throw 和 throws 的区别

特性 throw throws
作用 方法内部手动抛出异常对象 方法声明上标识可能抛出的异常
位置 方法体内部 方法签名后
数量 一次只能抛出一个异常 可声明多个异常
处理要求 受检异常需上层处理 受检异常必须捕获或继续向上抛出

代码示例

java 复制代码
public void test() throws IOException, NullPointerException {
    throw new IOException("文件读取失败");
}

4. try-catch-finally 执行顺序

  1. 优先执行 try 代码块
  2. 若出现异常,执行匹配的 catch 代码块
  3. 无论是否发生异常、是否捕获成功,最后都会执行 finally
    口诀:try → catch → finally

5. finally 中的代码一定会被执行吗?

不一定,出现以下场景不会执行:

  1. 执行 System.exit(0) 主动退出 JVM
  2. 线程被强制终止、JVM 崩溃
  3. 系统断电、硬件故障等物理问题
    正常运行环境下,finally 一定会执行。

6. finally 块中存在 return 语句的效果

  • finally 中的 return 会覆盖 try /catch 中的返回值
  • 方法最终以 finally 里的 return 结果返回
  • 开发规范:禁止在 finally 中使用 return
    *代码示例
java 复制代码
public int test() {
    try {
        return 1;
    } finally {
        return 2;
    }
}
// 最终返回结果:2

7. NoClassDefFoundError 和 ClassNotFoundException 的区别

异常类型 所属分类 产生原因 典型场景
ClassNotFoundException 受检 Exception 运行时找不到对应 class 文件 Class.forName、动态加载类
NoClassDefFoundError Error 编译期存在类,运行时缺失类定义 Jar 包丢失、版本冲突、类依赖缺失

简单总结:

  • ClassNotFoundException:类从头到尾没找到
  • NoClassDefFoundError:编译有,运行丢了

8. OutOfMemoryError & StackOverflowError 成因

StackOverflowError 栈溢出

原因:方法调用栈深度超出 JVM 栈容量限制

常见场景:无限递归、方法嵌套调用过深

OutOfMemoryError 内存溢出 (OOM)

原因:JVM 堆内存耗尽,无法分配新对象

常见场景:创建海量对象、内存泄漏、大对象持续占用内存


总结(速记版)

  1. Error 是虚拟机级错误,无法处理;Exception 是业务异常,可捕获处理。
  2. throw 抛异常对象,throws 声明异常。
  3. try-catch-finally 顺序固定,正常情况下 finally 必执行。
  4. finally 内 return 会覆盖前面返回值,不建议使用。
  5. ClassNotFoundException 是找不到类文件,NoClassDefFoundError 是编译存在、运行缺失。
  6. 无限递归易引发栈溢出,对象过多 / 内存泄漏易引发堆内存溢出。
相关推荐
周航宇JoeZhou1 小时前
JB3-9-SpringAI(二)
java·ai·agent·多智能体·调度·智能体·观察
好家伙VCC2 小时前
Web Components主题热切换方案揭秘
java·前端
慕木沐2 小时前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python
Roann_seo%2 小时前
C++文件操作完全指南:从文本读写到二进制文件处理
开发语言·c++
焦虑的说说3 小时前
秒杀系统设计方案
java
huangdong_3 小时前
淘宝商品SKU图自动分类技术深度解析:从DOM解析到智能归档
开发语言·javascript·ecmascript
阿正的梦工坊3 小时前
【Rust】12-借用检查器与非词法生命周期
开发语言·后端·rust
许彰午3 小时前
30_Java Stream流操作全解
java·windows·python
qq_2518364573 小时前
基于java Web网络订餐系统设计与实现 源码文档
java·开发语言·前端