每个异常表入口包含四个信息:
下面一个小例子:
public class GreetDemo { public static void main (String[] args) { GreetDemo gd = new GreetDemo(); gd.testException(); } public void testException () { try { System.out.println("hi"); int m = 1/0; } catch (NullPointerException e) { throw e; } catch (ArithmeticException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
testException方法的 字节码:
testException方法的异常表:
有上面的异常表可以知道,异常表中包含三个异常:NullPointerException , ArithmeticException, Exception
NullPointerException 捕捉的范围为上面bytecode的#0至#12 处理该异常从#15开始
ArithmeticException 捕捉的范围为上面bytecode的#0至#12 处理该异常从#18开始
ArithmeticException 捕捉的范围为上面bytecode的#0至#12 处理该异常从#26开始
分析一下上面bytecode
首先看一下常量池
由于上面的bytecode中只出现了常量池入口5,6,7,10,12,所以只展示这些常量池入口:
getstatic #5 <java/lang/System/out Ljava/io/PrintStream;> //获取静态变量 ldc #6 <hi> //从常量池获取常量"hi"并压入栈 invokevirtual #7 <java/io/PrintStream/println(Ljava/lang/String;)V> //调用动态方法 iconst_1 //把int类型的常量1压入栈 iconst_0 //把int类型的常量1压入栈 idiv //对栈顶的两个int类型进行处罚 istore_1 //从栈顶弹出int类型的值,并赋值给位置为1的局部变量 goto 19 //跳转的方法末,return, 退出此方法(方法正常结束) astore_1 //进入catch分支,把栈顶对象引用弹出,赋值给位置为1局部变量 aload_1 //把位置为1的对象引用进栈 athrow //弹出栈中异常引用,抛出异常 astore_1 //进入catch分支,把栈顶对象引用弹出,赋值给位置为1局部变量 aload_1 //把位置为1的对象引用进栈 invokevirtual #10 <java/lang/ArithmeticException/printStackTrace()V> //调用异常的printStackTrace方法 goto 19 //跳转的方法末,return, 退出此方法 astore_1 aload_1 invokevirtual #12 <java/lang/Exception/printStackTrace()V> return //退出方法
每个异常方法都和异常表相关联, 该异常表与方法的字节码序列一起送到class文件中
如果在方法执行的时候抛出异常,java虚拟机将会在整个异常表中搜索相匹配的项, 如果当前程序计数器在异常表的入口所指定的范围内, 而且所抛出的异常是该入口所指向的类(或为指定类的之类),那么该入口即为所询入口,当遇到第一个匹配项时, 虚拟机将程序计数器设为新的pc指针偏移量位置, 然后从该位置执行, 如果没有发现匹配项, 虚拟机从当前栈中弹出, 再次抛出同样的异常;当虚拟机弹出当前栈桢时,虚拟机马上停止执行当前方法,并且返回至调用本方法的方法, 但是并不继续执行该方法, 而是再该方法抛出同样的异常, 这就是虚拟机在该方法中执行同样的搜索异常表的操作
finally 关键字:
finally的执行大家都知道,在字节码中如何反应的呢?
下面是一个小例子:
public void testException () { try { System.out.println("hi"); int m = 1/0; } catch (NullPointerException e) { throw e; } catch (ArithmeticException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("fuck you"); } System.out.println("after fuck you, i want say hello"); }
testException方法的字节码为:
该方法的异常表为:
由上面的bytecode和异常表可以知道:
1 上面的bytecode存在重复的部分, #12至#17, #31至#36, #47至#52, #59至#64 这四个区域是重复的部分;他们是代码块finally语句块编译的部分
2 根据异常表可以知道每个异常捕捉到以后执行的行数;结合上面的bytecode可以知道,每个异常的bytecode执行之后就是finally语句块的bytecode;正常结束以后也是finally语句块的bytecode
3 结合以上两点可知,finally语句的字节码在任何可能执行到它的地方都加上了(正常结束,三个异常后面,都跟有finally语句的字节码)
相关推荐
《深入Java虚拟机(原书第2版)》,原书名《Inside the Java Virtual Machine,Second Edition》,作者:【美】Bill Venners,翻译:曹晓钢、蒋靖,出版社:机械工业出版社,ISBN:7111128052,出版日期:2003 年 9 ...
《深入JAVA虚拟机第二版》是由Bill Venners撰写,并由曹晓钢和蒋靖翻译的中文书籍。这本书是Java开发者必备的经典读物,它详细地解析了Java虚拟机(JVM)的工作原理,帮助读者深入理解Java程序的运行机制。尽管描述...
《深入Java虚拟机》是一本深受Java开发者喜爱的经典著作,它详细揭示了Java虚拟机(JVM)的工作原理,帮助开发者提升程序性能、理解和解决运行时问题。这本书的影印版以及附属光盘通常会包含一些补充材料,如源代码...
《Inside Java Virtual Machine》和《深入java虚拟机》等书籍提供了详细的技术解析,结合英文和中文版本的学习,可以更全面地理解JVM的内部运作。通过阅读这些资料,开发者不仅能掌握JVM的基本原理,还能学习如何...
《深入Java虚拟机第二版》是一本深受Java开发者喜爱的经典著作,它详尽地剖析了Java虚拟机(JVM)的工作原理,为程序员提供了深入了解Java平台核心机制的机会。随书光盘包含了书中提及的各种示例代码、实验数据以及...
《深入Java虚拟机》是一本深受Java开发者喜爱的著作,它详细解析了Java虚拟机(JVM)的工作原理,帮助读者理解并优化Java程序的运行效率。这本书的附带源码使得学习过程更加直观和实践导向,让读者有机会直接查看和...
第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16...
《深入JAVA虚拟机第二版》是一本专注于Java虚拟机(JVM)的权威指南,针对JVM的深入了解和优化提供了详尽的解析。这本书对于Java开发者、系统管理员以及对Java性能调优感兴趣的读者来说,是不可或缺的参考资料。下面...
《深入Java虚拟机》是Java开发者必读的经典之作,它详细揭示了Java虚拟机(JVM)的工作原理和内部机制,对于理解Java程序的运行性能、优化代码以及掌握Java平台核心技术具有极其重要的价值。这本书的第二版更是针对...
在Java虚拟机第二版中,我们可以深入探讨以下几个关键知识点: 1. **字节码与类加载机制**:Java程序编译后生成的是.class文件,里面包含的是字节码。JVM通过类加载器将这些字节码加载到内存中,进行验证、准备、...
第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16...
《深入Java虚拟机》是一本深受Java开发者喜爱的经典著作,主要关注Java虚拟机(JVM)的内部工作原理,帮助读者理解并优化Java程序的运行效率。第二版在此基础上进行了更新,涵盖了更多现代JVM的新特性和技术。下面将...
《深入Java虚拟机》是Java开发者必读的经典之作,它详细揭示了Java虚拟机(JVM)的工作原理,为优化程序性能提供了理论基础和技术指导。第二版更是对第一版进行了全面更新,涵盖了Java技术的最新发展,如Java 8、9、...
根据提供的信息,我们可以总结出以下关于《深入Java虚拟机》这本书的关键知识点: ### 书籍概述 本书名为《深入Java虚拟机》,由Bill Venners撰写,是一本详细讲解Java虚拟机内部工作原理的专业书籍。该书主要分为...
由于直接提供的内容信息中存在OCR扫描错误和内容重复的描述,无法从中提取和生成有效的...对于实现Java虚拟机的技术人员来说,深入理解该规范是必要的前提条件,因为这关系到能否正确、高效地实现一个遵循标准的JVM。
"深入Java虚拟机"这份PDG文档显然是一个详细探讨JVM内部运作的教程,以下将基于这个主题展开讲解。 1. **JVM结构**:JVM由类装载器、运行数据区、执行引擎、本地方法接口和本地库组成。类装载器负责加载.class文件...
【深入Java虚拟机(6)】Java语法糖编程开发技术共3页.pdf 在Java编程领域,Java虚拟机(JVM)是核心组件之一,它为Java程序提供了跨平台的运行环境。本资料主要探讨了Java语法糖的相关技术,这是Java语言的一个...
1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 Java程序设计语言 1.4 Java体系结构的代价 1.5 结论 1.6 资源页 第2章 平台无关 2.1 为什么要平台...
Java虚拟机(JVM)是...以上是对"深入JAVA虚拟机代码"主题的详细阐述,涵盖了JVM的基本结构、工作原理、内存管理、垃圾回收、并发控制以及优化策略等多个方面。理解和掌握这些知识对于任何Java开发者来说都极其重要。
深入java虚拟机第二版 第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 ...