【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. 无限递归易引发栈溢出,对象过多 / 内存泄漏易引发堆内存溢出。
相关推荐
不正经学生22 分钟前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
门思科技32 分钟前
LoRaWAN 设备类别:Class A、B、C 对比与选型指南
c语言·开发语言·php
恋恋西风3 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
学长毕业设计3 小时前
基于SpringBoot的公益基金管理系统(源码+文档+讲解视频)
java·spring boot·后端
Brilliantwxx3 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
东小西3 小时前
【SAA实战】第 3 篇 · 工具调用全攻略:把业务能力交给 Agent 自己调度
java·后端·spring
东小西3 小时前
【SAA实战】第 4 篇 · Agent 短期记忆:saver 让 Agent 跨轮记得住(threadId 隔离)
java·后端·spring
许彰午3 小时前
22-DataCenter报文序列化
java·低代码·架构·状态模式
2601_962065254 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
BizzZ_4 小时前
C++(22)——类型转换和IO流
开发语言·c++