`

深入java虚拟机 异常,异常表, finally

阅读更多

每个异常表入口包含四个信息:

 

 

 

下面一个小例子:

  

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语句的字节码)

  • 大小: 75.6 KB
  • 大小: 12.9 KB
  • 大小: 17.4 KB
  • 大小: 25.4 KB
  • 大小: 24.1 KB
  • 大小: 4.2 KB
  • 大小: 18.3 KB
分享到:
评论

相关推荐

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    《深入Java虚拟机(原书第2版)》,原书名《Inside the Java Virtual Machine,Second Edition》,作者:【美】Bill Venners,翻译:曹晓钢、蒋靖,出版社:机械工业出版社,ISBN:7111128052,出版日期:2003 年 9 ...

    深入JAVA虚拟机第二版 Bill Venners著 曹晓钢 蒋靖译

    《深入JAVA虚拟机第二版》是由Bill Venners撰写,并由曹晓钢和蒋靖翻译的中文书籍。这本书是Java开发者必备的经典读物,它详细地解析了Java虚拟机(JVM)的工作原理,帮助读者深入理解Java程序的运行机制。尽管描述...

    深入Java虚拟机及附属光盘

    《深入Java虚拟机》是一本深受Java开发者喜爱的经典著作,它详细揭示了Java虚拟机(JVM)的工作原理,帮助开发者提升程序性能、理解和解决运行时问题。这本书的影印版以及附属光盘通常会包含一些补充材料,如源代码...

    Java虚拟机规范 深入java虚拟机

    《Inside Java Virtual Machine》和《深入java虚拟机》等书籍提供了详细的技术解析,结合英文和中文版本的学习,可以更全面地理解JVM的内部运作。通过阅读这些资料,开发者不仅能掌握JVM的基本原理,还能学习如何...

    深入java虚拟机第二版随书光盘

    《深入Java虚拟机第二版》是一本深受Java开发者喜爱的经典著作,它详尽地剖析了Java虚拟机(JVM)的工作原理,为程序员提供了深入了解Java平台核心机制的机会。随书光盘包含了书中提及的各种示例代码、实验数据以及...

    深入Java虚拟机附源码

    《深入Java虚拟机》是一本深受Java开发者喜爱的著作,它详细解析了Java虚拟机(JVM)的工作原理,帮助读者理解并优化Java程序的运行效率。这本书的附带源码使得学习过程更加直观和实践导向,让读者有机会直接查看和...

    深入JAVA虚拟机第二版.pdf 目录

    第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16...

    深入JAVA虚拟机第二版.7z

    《深入JAVA虚拟机第二版》是一本专注于Java虚拟机(JVM)的权威指南,针对JVM的深入了解和优化提供了详尽的解析。这本书对于Java开发者、系统管理员以及对Java性能调优感兴趣的读者来说,是不可或缺的参考资料。下面...

    深入Java虚拟机(原书第二版清晰版).pdf

    《深入Java虚拟机》是Java开发者必读的经典之作,它详细揭示了Java虚拟机(JVM)的工作原理和内部机制,对于理解Java程序的运行性能、优化代码以及掌握Java平台核心技术具有极其重要的价值。这本书的第二版更是针对...

    java虚拟机

    在Java虚拟机第二版中,我们可以深入探讨以下几个关键知识点: 1. **字节码与类加载机制**:Java程序编译后生成的是.class文件,里面包含的是字节码。JVM通过类加载器将这些字节码加载到内存中,进行验证、准备、...

    深入Java虚拟机(原书第2版)及书中源代码

    第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16...

    深入Java虚拟机光盘

    《深入Java虚拟机》是一本深受Java开发者喜爱的经典著作,主要关注Java虚拟机(JVM)的内部工作原理,帮助读者理解并优化Java程序的运行效率。第二版在此基础上进行了更新,涵盖了更多现代JVM的新特性和技术。下面将...

    深入Java虚拟机,PDF格式

    《深入Java虚拟机》是Java开发者必读的经典之作,它详细揭示了Java虚拟机(JVM)的工作原理,为优化程序性能提供了理论基础和技术指导。第二版更是对第一版进行了全面更新,涵盖了Java技术的最新发展,如Java 8、9、...

    深入java虚拟机pdf英文版

    根据提供的信息,我们可以总结出以下关于《深入Java虚拟机》这本书的关键知识点: ### 书籍概述 本书名为《深入Java虚拟机》,由Bill Venners撰写,是一本详细讲解Java虚拟机内部工作原理的专业书籍。该书主要分为...

    Java虚拟机规范中文版

    由于直接提供的内容信息中存在OCR扫描错误和内容重复的描述,无法从中提取和生成有效的...对于实现Java虚拟机的技术人员来说,深入理解该规范是必要的前提条件,因为这关系到能否正确、高效地实现一个遵循标准的JVM。

    深入java虚拟机pdg资料

    "深入Java虚拟机"这份PDG文档显然是一个详细探讨JVM内部运作的教程,以下将基于这个主题展开讲解。 1. **JVM结构**:JVM由类装载器、运行数据区、执行引擎、本地方法接口和本地库组成。类装载器负责加载.class文件...

    【深入Java虚拟机(6)】Java语法糖编程开发技术共3

    【深入Java虚拟机(6)】Java语法糖编程开发技术共3页.pdf 在Java编程领域,Java虚拟机(JVM)是核心组件之一,它为Java程序提供了跨平台的运行环境。本资料主要探讨了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 虚拟机代码

    Java虚拟机(JVM)是...以上是对"深入JAVA虚拟机代码"主题的详细阐述,涵盖了JVM的基本结构、工作原理、内存管理、垃圾回收、并发控制以及优化策略等多个方面。理解和掌握这些知识对于任何Java开发者来说都极其重要。

    深入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 ...

Global site tag (gtag.js) - Google Analytics