司空见惯的Exception,你了解她的秘密吗?

简介: 大家好,我是指北君,对于Exception,不用说Java人都知道。指北君一直以来有个不治之症:对Java的一切东东有追根寻底的强迫症,不了解其所以然就睡不了觉,这不,为了能睡个好觉就带领大家探一探Exception的秘密。

引子


首先,指北君声明一下,这里讲的Exception不仅仅是Exception一个类,而是异常机制,就像下面图中的所有(含继承Error和Exception的)。

40.jpg

异常类图

当然JDK中更为细致的异常继承体系也不是本篇探讨内容,本次呢,指北君将对异常在JVM层面的执行原理和ARM进行介绍,这里ARM也不是芯片架构,而是指自动资源管理。


异常表


要想了解异常执行原理,异常表是一个最佳的入口,异常表是什么?我来看看下面的数据结构描述:

41.png

它是虚拟机中用于表述异常处理的一种数据结构,我再来看异常表的样例,下面是一段包含try-catch代码编译后的字节码中的内容:

42.png

逻辑上的表述可以用下图表示:

43.jpg


异常类图

  1. 监测从8-41(41不包含)号指令的IllegalArgumentException
  2. 监测从8-41指令的IOException
  3. 监测从8到53指令的结束动作,包含三种情况:跳出指令(比如return指令集);athrow指令且没有匹配的异常类型;指令执行到最后一条
  4. 如果监测到指定动作,则按照异常表进行跳转

现在,回到异常表,我们可以看到异常表包含多条异常处理数据,每条数据包含四个属性

  • from 监控的指令集起始编号
  • to 监控的指令集结束编号
  • target 满足条件后指令跳转目标
  • 异常匹配的类型,特殊类型any,对应fanally块,监控try块和catch块

对于return,athrow等指令,执行顺序需要注意,指令是在对应的处理之后执行。

可能会让你意识混乱的例子:

44.png

我们之前说过finally块会在return之前执行,那是不是执行结果是:try->finally->end这种顺序呢?实际的执行的结果是:try-block,end。可以看到,finally块没有对结果形成影响,当然,这并不说它没执行,只是reutrn的结果在执行finally块时已经计算出结果了,在执行完finally块后将之前计算的结果返回了而已。所以我们要深入理解了执行的原理,才能正确理解结果。


ARM 自动资源管理


讲完前面的异常执行原理后,指北君现在给大家介绍异常机制在JDK1.7中一个优化特性:自动资源管理。经常使用IO的小伙伴一定对关闭IO很烦,写法繁琐,关闭前还要做判断,并且在关闭块代码还要加try-catch,就如同下面类似的代码:

45.png

反正指北君每次写这种代码的时候很烦,就是那种啥事没干,占我一块黄金代码位置的感觉,对于有精简代码癖好的人来说,就像吃了一口苍蝇般难受。有了ARM后,我们再来看看新的写法:


46.png

是不是简洁多了,资源直接在try后的括号内进行声明,而且不需要显式的关闭流的代码,这难道就是ARM!是不是有点小兴奋!对于ARM自动资源管理要点如下:

  • 在try后的括号内声明需要自动关闭的资源
  • 资源必须实现一个关键接口:AutoCloseable。在满足上面的条件后,JDK将为我们自动关闭资源。当然这种写法即使想手动关闭,在catch和finally部分也拿不到资源引用。

又到了追根溯源环节了,自动资源管理是如何实现的呢?先看看class文件有啥变化。


47.png

对比之前的字节码文件,我们明显发现虽然代码行数少了,但是Class编译后的内容一点都没少,而且异常表中除了finally对应的处理,还增加了额外的部分。具体几个不同点:

  1. 字节码中竟然有close调用
  2. 异常表中增加了内容


48.png好奇怪的异常表,我们查看指令,可以明显找出最后一条是对应finally处理。前面的呢?经过分析我们发现前面是finally形式的关闭资源。看到这里,结果就很明显了,自动资源管理实际是上编译帮助我们做了显示关闭的逻辑,在JVM执行层面没有增加新的功能。简而言之,自动资源管理是编译器层面的改进,通过扩展语法和增强编译能力(增加自动的资源关闭能力)来实现自动化编码。


总结


关于Java的异常的原理,以及自动资源管理的用法和实现方式,指北君就给大家介绍到这里。

最后感谢各位人才的:点赞、收藏和评论,我们下期更精彩!


相关文章
|
人工智能 文字识别 数据安全/隐私保护
ABBYY FineReader16最新版图片文字识别工具功能介绍
ABBYY FineReader16是一款功能强大的OCR识别软件,也是abbyy finereader系列的全新推出的版本。ABBYY FineReader能够帮助用户提高处理文档时的业务生产力,还提供强大且易用的工具来访问纸质文档和PDF中的信息。
1782 0
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
590 212
|
4天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
234 138
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
828 60
|
7天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1222 157
|
6天前
|
存储 安全 固态存储
四款WIN PE工具,都可以实现U盘安装教程
Windows PE是基于NT内核的轻量系统,用于系统安装、分区管理及故障修复。本文推荐多款PE制作工具,支持U盘启动,兼容UEFI/Legacy模式,具备备份还原、驱动识别等功能,操作简便,适合新旧电脑维护使用。
514 109