【java】java try catch finally 字节码原理 finally语句为何一定会执行

在这里插入图片描述

1.概述

以前只知道有这么回事,但是却不知道原理,在本章节了解到相关原理。本章出自《深入理解JVM字节码 》

Java中有一个非常重要的内容是try-catch-finally 的执行顺序和返回值问题,大部分书里说过finally 一定会执行,但是为什么是这样?下面来看看try-catch-finally 这个语法糖背后的实现原理。

2. try-catch字节码分析

下面是一个简单的try-catch的例子。

在这里插入图片描述
对应的字节码如下

在这里插入图片描述

  1. 第0~1行: aload_0指令加载this,随后使用invokevirtual 指令调用try[tOut1 方法,关于invokevirtual的详细用法在第3章会介绍,这里只需要知道invokevirtual 是方法调用指令即可。

  2. 第4行:goto语句是如果tryItOut1方法不抛出异常就会跳转到第13行继续执行
    return指令,方法调用结束。如果有异常抛出,将如何处理呢?

  3. 从第1章的内容可以知道,当方法包含try-catch 语句时,在编译单元生成的方法的
    Code属性中会生成一个异常表( E

猜你喜欢

转载自blog.csdn.net/qq_21383435/article/details/125243824