`

在编译级别1.4时jvm编译try/catch/finally块的方式

阅读更多

        先上一段很简单,且不考虑健壮性的源码:

import java.io.FileInputStream;
import java.io.IOException;
public class TryCatchFinallyTest {
	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		FileInputStream fips = null;
		try {
			fips = new FileInputStream("hello.txt");
			fips.read();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			fips.close();
		}
	}
}

         然后上一段这段代码在eclipse编译级别为1.4、没有inline finally块时编译出的字节码:

// Compiled from TryCatchFinallyTest.java (version 1.2 : 46.0, super bit)
public class TryCatchFinallyTest {
  // Method descriptor #6 ()V
  // Stack: 1, Locals: 1
  public TryCatchFinallyTest();
    0  aload_0 [this]
    1  invokespecial java.lang.Object() [8]
    4  return
      Line numbers:
        [pc: 0, line: 6]
      Local variable table:
        [pc: 0, pc: 5] local: this index: 0 type: TryCatchFinallyTest
  // Method descriptor #15 ([Ljava/lang/String;)V
  // Stack: 3, Locals: 5
  public static void main(java.lang.String[] args) throws java.io.IOException;
     0  aconst_null
     1  astore_1 [fips]
     2  new java.io.FileInputStream [19]
     5  dup
     6  ldc <String "hello.txt"> [21]
     8  invokespecial java.io.FileInputStream(java.lang.String) [23]
    11  astore_1 [fips]
    12  aload_1 [fips]
    13  invokevirtual java.io.FileInputStream.read() : int [26]
    16  pop
    17  goto 43
    20  astore_2 [e]
    21  aload_2 [e]
    22  invokevirtual java.io.IOException.printStackTrace() : void [30]
    25  goto 43
    28  astore 4
    30  jsr 36
    33  aload 4
    35  athrow
    36  astore_3
    37  aload_1 [fips]
    38  invokevirtual java.io.FileInputStream.close() : void [33]
    41  ret 3
    43  jsr 36
    46  return
      Exception Table:
        [pc: 2, pc: 17] -> 20 when : java.io.IOException
        [pc: 2, pc: 25] -> 28 when : any
        [pc: 43, pc: 46] -> 28 when : any
      Line numbers:
        ......
      Local variable table:
        [pc: 0, pc: 47] local: args index: 0 type: java.lang.String[]
        [pc: 2, pc: 47] local: fips index: 1 type: java.io.FileInputStream
        [pc: 21, pc: 25] local: e index: 2 type: java.io.IOException
}

         2-17是try块代码;

           20-25是catch块代码;

           28-35是编译期生产的catch块之外的异常即any类型异常要执行的代码;

           36-41是finally块代码;

           43-46是编译期生成的字节码;

           其中偏移量17和25处都是goto 43,然后jsr到finally,即try和catch块都是到43;any类型中有一条指令jsr到finally块。

        归纳总结下,try/catch/finally结构中:

        1、try/catch块翻译成指令后最后一条字节码指令都是goto到一个编译出来的块A(43-46),A第一条指令(43)即jsr到finally块第一条指令,finally完就ret到A第二条指令即return(46)

        2、any块,即catch之外的异常类型,也即any,是jvm自己构造了一个指令块B(28-35),先store下这种异常实例到局部变量表(28),然后jsr到finally块中(30),finally完就ret到B的第三条指令(33)执行,load出之前存储到局部变量表的异常实例,然后athrow(35)。

 

        JSR指令后边一般是:

        1、load返回值然后return的指令(try/catch块,有返回值)

        2、直接return(try/catch块,无返回值)

        3、load出异常然后athrow(catch any)

 

分享到:
评论

相关推荐

    Java异常是Java提供的一种识别及响应错误的一致性机制,Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序

    文章目录: Java异常架构与异常关键字 Java异常简介 Java异常架构 1. Throwable 2. Error(错误) 3. Exception(异常) 运行时异常 编译时异常 4. 受检异常与非受检异常 ...7. try-catch-finally 中哪个部分可以省略?

    积分java源码-stab-language:在JVM上运行的类似AC#的语言,从原始的GoogleCode项目导出并进行了一些清理

    积分java源码stab 语言 自动导出自 一种为 Java 虚拟机设计的多范式编程语言 设计目标 用于设计 Stab 的目标如下: ...程序员应该可以毫无困难地阅读语法 ...库应该可以在没有改编的...编译时通用编程,包括约束和通配符 注释

    JAVA面试题最全集

    50.JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally 51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52.一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握...

    超级有影响力霸气的Java面试题大全文档

    当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...

    net学习笔记及其他代码应用

    43.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 答:会执行,在return前执行。 44.两个对象值相同(x.equals(y) == true),但却可有不同...

    java 面试题 总结

    换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session ...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    8.1.1 使用try、catch 232 8.1.2 异常继承架构 235 8.1.3 要抓还是要抛 238 8.1.4 认识堆栈追踪 241 8.1.5 关于assert 245 8.2 异常与资源管理 247 8.2.1 使用finally 247 8.2.2 自动尝试关闭资源 ...

    疯狂JAVA讲义

    学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...

    二十三种设计模式【PDF版】

    以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) 就是将类用树形结构组合成...

    AIC的Java课程1-6章

     学习使用throw,throws检测抛出异常,使用try,catch捕获处理异常,使用finally子句释放资源。  掌握Java的异常层次结构,辨别checked exception和unchecked exception。  能够分别创建新的异常类,...

    Java范例开发大全 (源程序)

     实例47 try…catch…finally捕获异常的实例 67  实例48 try…catch嵌套捕获异常的实例 68  4.4 throws声明异常 69  实例49 throws声明异常实例一 69  实例50 throws声明异常实例二 70  4.5 throw抛出...

    java范例开发大全(pdf&源码)

    实例47 try…catch…finally捕获异常的实例 67 实例48 try…catch嵌套捕获异常的实例 68 4.4 throws声明异常 69 实例49 throws声明异常实例一 69 实例50 throws声明异常实例二 70 4.5 throw抛出异常 72 实例51 throw...

    java范例开发大全源代码

     实例47 try…catch…finally捕获异常的实例 67  实例48 try…catch嵌套捕获异常的实例 68  4.4 throws声明异常 69  实例49 throws声明异常实例一 69  实例50 throws声明异常实例二 70  4.5 throw抛...

    java范例开发大全

    实例47 try…catch…finally捕获异常的实例 67 实例48 try…catch嵌套捕获异常的实例 68 4.4 throws声明异常 69 实例49 throws声明异常实例一 69 实例50 throws声明异常实例二 70 4.5 throw抛出异常 72 实例51 throw...

    Java范例开发大全(全书源程序)

    实例47 try…catch…finally捕获异常的实例 67 实例48 try…catch嵌套捕获异常的实例 68 4.4 throws声明异常 69 实例49 throws声明异常实例一 69 实例50 throws声明异常实例二 70 4.5 throw抛出异常 72 实例51...

Global site tag (gtag.js) - Google Analytics