面试中经常有关于try、catch、finally相关的问题,今天从字节码层面了解他们的运行流程。

简单代码

直接上测试简单代码,如下图:

这里是一个简单的测试代码,代码中有三个异常和一个finally,这里用一个int数组来替代对象,面试中经常会问最终会返回数组(对象)的值是多少?

在这里我们通过jclasslib查看编译后的字节码,并找到方法的字节码指令,如下图:

右边被圈中的就是test()方法执行的字节码指令,字节码指令较长,接下来一部分一部分的分析。

字节码指令分析

前面30行之前的指令对应的是try-catch中间的代码,把fileInputStream与serverSocket初始化出来放到方法的变量表中。

接着30行之后的指令如下图:

aload_1加载本地变量表中第1项变量(this是第0项,ids是第1项),接着iconst_0、iconst_1分别表示加载int型0、1,iastore表示把第数组第0项设置值为1,最后astore表示把数组存入本地变量表,也就是在执行"ids[0] =1"这一步代码。

我们看接下来37至40行指令与上一步比较相似,翻译过来是在执行"ids[0]=5",41行至49行在执行"System.out.println("finally code");"这样代码,51行才执行了return;

从上一段分析可以看出,直到finally中的代码执行完成后才执行了return指令。这样我们就能回答面试的那个问题了,因为在finally中修改了数组的值!

异常处理

先看看这个方法的异常表,如下图:

异常表中除了我们代码中指明的三个异常外,编译器还自动生成了5个Any类型的异常,用于处理其他不可预期的异常处理。圈中的三列分别表示异常监控的指令开始、结束行以及处理行,也就是在对应的指令行出现异常他们就能处理。

可以看到我们指明的异常监控的是try-catch中的指令,而编译器生成的则是监控异常处理中的指令。

继续看字节码指令,如下图:

根据异常表我已经圈出了第一个异常处理的指令,从52行开始,astore_2表示将索引存储到本地变量表中第2项,实际上就是将"FileNotFoundException e"产生的变量e存入,53至56行指令则是将数字2存入数组中,对应代码"ids[0]=2;",说明在执行第一个catch中的代码。

后面的指令可以很明显的看出来又是在执行finally中的代码,后面的几个异常基本相似,都是执行自己的catch中的代码后再次执行finally中代码,这里就不再一一分析了!

总结

根据以上分析可以看出,finally不管是程序正常执行还是有异常,在字节码层面都会把finally中的代码编译在正常和异常代码后面,所以有多少个catch,finally代码就会多编译多少次,并且return指令都是在finally中的代码执行完成后才执行!

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

catch后面的代码会执行吗_字节码层面理解try、catch、finally相关推荐

  1. 5码默认版块_用字节码解释try、catch、finally、i++、++i的执行结果?

    推荐学习 肝了十天半月,献上纯手绘"Spring/Cloud/Boot/MVC"全家桶脑图 一箭双雕!Alibaba架构师,纯手打Cloud+Boot微服务架构笔记 最新" ...

  2. 第十九篇_字节码指令集与解析

    文章目录 概述 执行模型 字节码与数据类型 指令分类 加载与存储指令 再谈操作数栈和局部变量表 局部变量压栈指令 常量入栈指令 出栈装入局部变量表 算术运算符指令以及举例 所有的运算符指令 比较指令的 ...

  3. Python源码学习笔记:Python程序执行过程与字节码

    Python程序执行过程与字节码 注:本篇是根据教程学习记录的笔记,部分内容与教程是相同的,因为转载需要填链接,但是没有,所以填的原创,如果侵权会直接删除. 问题: 我们每天都要编写一些Python程 ...

  4. catch抛出异常finally还执行吗_你真的了解try、catch、finally吗

    如下: 1.无返回值函数,如果没有 catch 异常,finally 代码块会执行,再抛出异常 2.有返回值函数,如果在 finally 里面有返回值,[无论有没catch异常],都会正常返回,不抛异 ...

  5. java代码的执行机制_关于java代码的执行机制

    转载于:https://blog.csdn.net/houfeng777123/article/details/74316748 1.Java代码执行流程 ·第一步:*.java-->*.cla ...

  6. JVM类加载机制_字节码执行引擎_Java内存模型

    类加载机制: 类加载生命期:加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Usi ...

  7. 1 字节的 utf-8 序列的字节 1 无效_字节码文件结构详解

    点击上方" Java资料站 ",选择"标星公众号" 优质文章,第一时间送达 陈建源  |  作者 urlify.cn/INFrUr  |  来源 "一 ...

  8. 大端字节序码流中取出2字节_字节码忍者的秘密

    大端字节序码流中取出2字节 Java语言由Java语言规范(JLS)定义. 但是,Java虚拟机的可执行字节码由单独的标准Java虚拟规范(通常称为VMSpec)定义. JVM字节码由javac从Ja ...

  9. java字节码和机器码_字节码和机器码

    字节码 字节码是一种中间码 字节码通常指的是已经经过编译,但与特定机器码无关,需要直译器转译后才能成为机器码的中间代码.字节码通常不像源码一样可以让人阅读,而是编码后的数值常量.引用.指令等构成的序列 ...

最新文章

  1. python进程池调用实例方法_Python进程池Pool应用实例分析
  2. System.getProperty()的用途
  3. 【计算机网络复习 数据链路层】3.1 数据链路层功能概述
  4. 华为员工“削尖脑袋”想进荣耀!网友也可以放心了,荣耀产品售后不受影响...
  5. 超强计算机病毒代码,木马编程 之超强服务... 附代码 原创.
  6. 注册表清理工具PC Performer
  7. 集异璧摘录:pq系统-加法-乘法-合数-素数
  8. PcShare2005控制端修改
  9. AE zoom to selected 地图刷新
  10. 【读过的书】《蔡康永的说话之道》
  11. 《区块链底层设计Java实战》之第一章区块链简介
  12. 路由配置:理解secondary ip address
  13. 华为副总裁的演讲,披露了华为在5G领域最新布局
  14. Guiding Teacher Forcing with Seer Forcing for Neural Machine Translation翻译
  15. html倒计时的原理,JS实现活动精确倒计时 - 轩枫阁
  16. 学计算机游戏与动漫好吗,学习计算机动漫与游戏制作前途如何?
  17. 低通采样定理 matlab,基于matlab的低通抽样定理仿真
  18. 开始topcoder
  19. 你所需要了解的关于 Monorepo 的一切
  20. 万能配置的大屏可视化功能来啦~

热门文章

  1. Linux文件目录类命令
  2. 第三章 系统指令与汇编程序设计 3.1 单片机指令系统
  3. python 城市地图_python – 使用Basemap获取城市地图的最佳方式?
  4. 【二叉查找树BST】二叉查找树的基本操作总结
  5. chrome 插件精选之 github 篇
  6. 面试又挂了,你理解了 Java 8 的 Consumer、Supplier、Predicate和Function吗?
  7. (JAVA学习笔记) 关于i++和++i的区别
  8. 面试官:谈谈Redis缓存和MySQL数据一致性问题
  9. java优先队列PriorityQueue修改队列内元素排序问题
  10. Android细节问题总结(一)