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

Posted 九师兄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javajava 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

以上是关于javajava try catch finally 字节码原理 finally语句为何一定会执行的主要内容,如果未能解决你的问题,请参考以下文章

try-catch-finally 中哪个部分可以省略?try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

try{ } catch{ } finally{ }

java中的“try - catch -finally”结构中的“finally”都有哪些用途

为啥在 Try ... Catch 中使用 finally

try...catch...finally

try catch finally