【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. 无限递归易引发栈溢出,对象过多 / 内存泄漏易引发堆内存溢出。
相关推荐
油丶酸萝卜别吃6 小时前
utils.js 说明文档
开发语言·javascript·ecmascript
rannn_1118 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
leisoo80978 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
不会代码的小猴9 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
IKUN家族10 小时前
Spring IoC&DI
java·spring·rpc
一只旭宝10 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
山荷枝11 小时前
03-框架--Spring
java·后端·spring
ChaHae-In11 小时前
SpringBoot统一功能处理
java·spring boot·后端
coder!mq12 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding12 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言