先上一段很简单,且不考虑健壮性的源码:
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)
相关推荐
1. **增强的异常处理**:JDK 1.4引入了`finally`块的省略,当`try`块中只有一个语句时,可以将`try-catch-finally`合并为一个简洁的语法结构,提高了代码的可读性。 2. **NIO (New IO)**:非阻塞I/O模型,提供了更...
这些代码通常是由特殊的for循环、try catch finally语句块、synchronized语句反编译后产生的。 下面,我们将介绍一些反编译后的特殊代码的还原规则。 1. 异常的还原 反编译后的代码如下: ```java public boolean...
当try块中的代码执行时,如果出现异常,控制权会立即转移到相应的catch块,如果没有catch块,JVM会尝试向上层的try-catch结构传递异常。 2. **catch 代码块**:紧随try块之后,用于捕获特定类型的异常。每个catch块...
- JVM支持异常处理框架,通过try-catch-finally语句块来捕获和处理异常。 8. **多线程** - JVM支持多线程并发执行,每个线程有自己的程序计数器、栈和本地方法栈。 9. **动态性与适应性** - JVM允许在运行时...
- **try-catch**:基本的异常处理结构,其中`try`块包含可能抛出异常的代码,而`catch`块则定义了处理异常的代码。可以有多个`catch`块,分别处理不同类型的异常。 ```java try { // 可能抛出异常的代码 } catch ...
如果程序中可能抛出编译时异常,那么必须通过try-catch块捕获异常,或者在方法签名中用throws关键字抛出。编译时异常应当在程序中显式处理,不能忽略,否则会导致编译失败。 Java异常的处理机制中,还区分了受检...
4. 异常处理:Java提供了一套完整的异常处理机制,通过try、catch、finally等语句,能够优雅地处理程序运行中可能出现的异常情况。 5. 跨平台性:Java程序能够在任何安装了JVM的平台上运行,这使得Java应用的部署和...
2. `try`、`catch`和`finally`块内的变量作用域仅限于各自块内,如果需要跨块访问,需要在外部定义。 3. 多个`catch`块时,JVM会按顺序匹配异常类型,匹配到第一个合适的`catch`块后,不会继续匹配后续的`catch`块。...
在Java中,异常处理是通过五个关键字来实现的:try、catch、finally、throw和throws。 1. **try** 块:这是异常处理的起点。try块包含可能会抛出异常的代码。如果在try块中的代码抛出了异常,控制权会立即转交给...
8. **异常处理**:JVM根据字节码中的异常表来处理异常,支持try-catch-finally结构,确保finally块总能得到执行。 9. **模块系统(Module System)**:Java9引入了模块化系统,以帮助开发者更好地组织和管理大型...
3. **异常处理**:XJad处理Java的异常处理结构,尽可能地恢复try-catch-finally块。 4. **注释和变量名恢复**:尽管无法恢复原始的注释和变量名,XJad会生成有意义的临时标识符以提高可读性。 5. **优化的代码输出**...
7. **异常处理**:JVM支持异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误。 8. **多线程**:JVM原生支持多线程,每个线程有自己的程序计数器、虚拟机栈和本地方法栈,共享堆内存。 9. **JNI...
7. **异常处理**:JVM需要处理try-catch-finally语句块和异常抛出。C实现需实现对应的异常处理机制。 8. **类文件验证**:在加载类之前,JVM会进行验证,确保字节码符合规范。C语言实现应包含一套验证规则和检查。 ...
如果try块中的代码抛出异常,控制流会立即跳转到对应的catch块,如果没有任何catch块能匹配异常类型,则异常会被向上抛出至调用者处理。不管是否发生异常,finally块中的代码总是会被执行,这通常用于释放资源或者...
10. **异常处理**:Java异常处理机制通过try-catch-finally语句块来捕获和处理运行时错误,JVM在字节码层面实现了这一机制。 11. **JVM内存溢出**:当内存分配超过限制时,会发生内存溢出错误。常见的溢出类型有堆...
一个`try`块可以跟随一个或多个`catch`块,每个`catch`块捕获特定类型的异常。例如: ```java try { // 可能抛出异常的代码 } catch (IOException e) { // 处理IOException } catch (NullPointerException e) { ...
10. 异常处理:Java中的异常处理机制是通过try-catch-finally语句实现的,JVM对此提供了支持,帮助程序处理运行时错误。 综上所述,JAVA JVM文件对于理解和优化Java应用程序的性能至关重要。在实际开发和运行Java...
JVM提供了一套异常处理机制,通过try-catch-finally语句块来捕获和处理程序运行过程中出现的各种异常情况。此外,JVM还支持自定义异常类型,允许开发者根据实际需求创建特定类型的异常。 #### 平台独立性 Java的...
finally块总是会执行,它通常用于释放资源,如关闭文件句柄等,即使在try块或者catch块中执行了return语句,finally块中的代码也会被执行。 在进行Java异常处理时,应当遵循一定的最佳实践。比如,避免使用过于宽泛...
编译时异常必须在try块或在方法定义的throws子句中显式处理,如果一个方法声明了抛出一个异常,那么调用该方法的代码必须处理该异常,要么在try-catch块中捕获异常,要么通过方法签名上的throws子句继续向上抛出异常...