栈帧:方法执行中的异常处理表(Exception Table)

冷炫風刃

冷炫風刃

2026-07-06

980人浏览

原创

jvm抛出异常时先查当前栈帧的异常处理表,该表由编译器生成、存于code属性中,按from-to范围、type类型匹配及target跳转执行catch或finally。

栈帧:方法执行中的异常处理表(exception table)

当方法执行中抛出异常时,JVM 不会盲目地向上层调用者传递,而是先在当前栈帧的 异常处理表(Exception Table) 中查找匹配的捕获规则。这个表是编译期生成、存储在方法的字节码属性 Code 中的结构,决定了“哪个异常类型、在哪个代码范围内、跳转到哪条指令去处理”。

异常处理表的结构与含义

每条表项包含四个字段:

  • fromto:表示监控的字节码索引范围(左闭右开),仅当异常发生在该区间内才考虑此条目
  • target:异常处理器的起始字节码索引,即 catch 块对应的指令位置
  • type:指向常量池中一个 CONSTANT_Class_info 符号引用,代表能被此处理器捕获的异常类(如 java/lang/NullPointerException);若为 null(即值为 0),表示匹配任意异常(对应 catch (Throwable e)finally

try-catch-finally 如何映射为异常表项

一个 try-catch-finally 结构通常生成多条异常表项:

Zyro AI Background Remover
Zyro AI Background Remover

Zyro推出的AI图片背景移除工具

下载
  • 每个 catch 块对应一条表项,type 指向其声明的异常类型,from-to 覆盖整个 try 块范围
  • finally 块会被编译器“复制”到多个位置:正常执行末尾、每个 catch 块末尾、以及所有可能提前退出(如 returnbreak)的位置;对应地,会添加若干条 type = null 的表项,覆盖各监控区域并指向 finally 入口
  • 因此,即使没有显式 catch,只要存在 finally,异常表中也会有 type = null 的项,确保异常传播前先执行 finally

异常匹配的查找过程

JVM 抛出异常时,在当前方法的异常表中按顺序扫描:

  • 跳过 from >= pcto 的项(<code>pc 是异常发生的字节码位置)
  • 对剩余项,检查异常对象是否是 type 所指类或其子类(包括 type == null 的情况)
  • 找到第一条匹配项后,清空操作数栈,将异常对象压入栈顶,然后跳转到 target 指令继续执行(即进入 catchfinally
  • 若遍历完无匹配,则当前方法调用结束,异常沿调用栈向上传播,由上层栈帧重复该过程

常见误区与注意事项

异常表是静态结构,不支持运行时动态注册;它的行为完全由编译器根据源码结构生成:

  • catch 子句的异常类型必须是 Throwable 的子类,否则编译失败——因为异常表中的 type 必须指向有效类符号
  • 空的 catch 块(如 catch (Exception e) {})仍会生成异常表项,只是后续字节码不处理异常对象
  • 多异常捕获(catch (IOException | SQLException e))在字节码中表现为多条异常表项,分别指向同一 target,但 type 各自不同
  • 异常表不记录 throws 声明,后者仅用于编译期检查,不影响运行时异常分发逻辑

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java异常处理

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

2269

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

1166

6

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

8

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

6

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

8

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

4

10

火山引擎域名备案流程详解
火山引擎域名备案流程详解

火山引擎域名备案适合需要在火山引擎云服务器、对象存储、CDN或网站服务上绑定域名的用户参考。本专题整理备案入口、账号实名认证、备案类型选择、主体信息填写、网站信息提交、资料上传、初审核验、管局审核和备案失败排查,帮助用户完成网站上线前的备案流程。

2026.08.04

0

10

火山引擎DNS解析配置步骤
火山引擎DNS解析配置步骤

使用火山引擎DNS解析网站域名时,需要确认域名已完成管理接入,并正确配置服务器IP、CNAME地址或验证记录。本专题整理域名添加、记录类型选择、TTL设置、解析状态检查、备案和访问测试等流程,适合新手搭建网站时参考。

2026.08.04

3

10

火山引擎对象存储使用教程
火山引擎对象存储使用教程

火山引擎对象存储适合用于网站图片、视频文件、备份数据、静态资源和应用附件管理。本专题整理TOS控制台入口、存储桶创建、地域选择、权限设置、文件上传、访问链接生成、CDN加速、费用查看和常见上传或访问失败问题,帮助用户快速掌握对象存储基础操作。

2026.08.04

1

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.4万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 131.8万人学习