`

在编译级别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 开发工具 jdk 1.4 免安装版

    1. **增强的异常处理**:JDK 1.4引入了`finally`块的省略,当`try`块中只有一个语句时,可以将`try-catch-finally`合并为一个简洁的语法结构,提高了代码的可读性。 2. **NIO (New IO)**:非阻塞I/O模型,提供了更...

    java class反编译后的代码还原

    这些代码通常是由特殊的for循环、try catch finally语句块、synchronized语句反编译后产生的。 下面,我们将介绍一些反编译后的特殊代码的还原规则。 1. 异常的还原 反编译后的代码如下: ```java public boolean...

    06JVM是如何处理异常的1

    当try块中的代码执行时,如果出现异常,控制权会立即转移到相应的catch块,如果没有catch块,JVM会尝试向上层的try-catch结构传递异常。 2. **catch 代码块**:紧随try块之后,用于捕获特定类型的异常。每个catch块...

    JVM的运行机制

    - JVM支持异常处理框架,通过try-catch-finally语句块来捕获和处理异常。 8. **多线程** - JVM支持多线程并发执行,每个线程有自己的程序计数器、栈和本地方法栈。 9. **动态性与适应性** - JVM允许在运行时...

    oracle认证的java考试(19)

    - **try-catch**:基本的异常处理结构,其中`try`块包含可能抛出异常的代码,而`catch`块则定义了处理异常的代码。可以有多个`catch`块,分别处理不同类型的异常。 ```java try { // 可能抛出异常的代码 } catch ...

    Java异常面试题 33道.pdf

    如果程序中可能抛出编译时异常,那么必须通过try-catch块捕获异常,或者在方法签名中用throws关键字抛出。编译时异常应当在程序中显式处理,不能忽略,否则会导致编译失败。 Java异常的处理机制中,还区分了受检...

    jvm特性与java特性

    4. 异常处理:Java提供了一套完整的异常处理机制,通过try、catch、finally等语句,能够优雅地处理程序运行中可能出现的异常情况。 5. 跨平台性:Java程序能够在任何安装了JVM的平台上运行,这使得Java应用的部署和...

    Java异常体系结构[定义].pdf

    2. `try`、`catch`和`finally`块内的变量作用域仅限于各自块内,如果需要跨块访问,需要在外部定义。 3. 多个`catch`块时,JVM会按顺序匹配异常类型,匹配到第一个合适的`catch`块后,不会继续匹配后续的`catch`块。...

    Java异常处理

    在Java中,异常处理是通过五个关键字来实现的:try、catch、finally、throw和throws。 1. **try** 块:这是异常处理的起点。try块包含可能会抛出异常的代码。如果在try块中的代码抛出了异常,控制权会立即转交给...

    JAVA8虚拟机(jvm)规范_Chinese version.rar

    8. **异常处理**:JVM根据字节码中的异常表来处理异常,支持try-catch-finally结构,确保finally块总能得到执行。 9. **模块系统(Module System)**:Java9引入了模块化系统,以帮助开发者更好地组织和管理大型...

    java反编译工具XJad

    3. **异常处理**:XJad处理Java的异常处理结构,尽可能地恢复try-catch-finally块。 4. **注释和变量名恢复**:尽管无法恢复原始的注释和变量名,XJad会生成有意义的临时标识符以提高可读性。 5. **优化的代码输出**...

    jvm.rar_JAVA虚拟机_jvm

    7. **异常处理**:JVM支持异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误。 8. **多线程**:JVM原生支持多线程,每个线程有自己的程序计数器、虚拟机栈和本地方法栈,共享堆内存。 9. **JNI...

    基于C语言实现的JVM.zip

    7. **异常处理**:JVM需要处理try-catch-finally语句块和异常抛出。C实现需实现对应的异常处理机制。 8. **类文件验证**:在加载类之前,JVM会进行验证,确保字节码符合规范。C语言实现应包含一套验证规则和检查。 ...

    java异常体系结构

    如果try块中的代码抛出异常,控制流会立即跳转到对应的catch块,如果没有任何catch块能匹配异常类型,则异常会被向上抛出至调用者处理。不管是否发生异常,finally块中的代码总是会被执行,这通常用于释放资源或者...

    深入理解JVM

    10. **异常处理**:Java异常处理机制通过try-catch-finally语句块来捕获和处理运行时错误,JVM在字节码层面实现了这一机制。 11. **JVM内存溢出**:当内存分配超过限制时,会发生内存溢出错误。常见的溢出类型有堆...

    第章Java高级编程2022优秀文档.ppt

    一个`try`块可以跟随一个或多个`catch`块,每个`catch`块捕获特定类型的异常。例如: ```java try { // 可能抛出异常的代码 } catch (IOException e) { // 处理IOException } catch (NullPointerException e) { ...

    JAVA JVM文件

    10. 异常处理:Java中的异常处理机制是通过try-catch-finally语句实现的,JVM对此提供了支持,帮助程序处理运行时错误。 综上所述,JAVA JVM文件对于理解和优化Java应用程序的性能至关重要。在实际开发和运行Java...

    JVM(Java 虚拟机)的详细讲解

    JVM提供了一套异常处理机制,通过try-catch-finally语句块来捕获和处理程序运行过程中出现的各种异常情况。此外,JVM还支持自定义异常类型,允许开发者根据实际需求创建特定类型的异常。 #### 平台独立性 Java的...

    Java异常面试题全部资源

    finally块总是会执行,它通常用于释放资源,如关闭文件句柄等,即使在try块或者catch块中执行了return语句,finally块中的代码也会被执行。 在进行Java异常处理时,应当遵循一定的最佳实践。比如,避免使用过于宽泛...

    Java异常基础知识总结文档

    编译时异常必须在try块或在方法定义的throws子句中显式处理,如果一个方法声明了抛出一个异常,那么调用该方法的代码必须处理该异常,要么在try-catch块中捕获异常,要么通过方法签名上的throws子句继续向上抛出异常...

Global site tag (gtag.js) - Google Analytics