探究一下try返回后finally还能返回是怎么在java虚拟机实现的?

一.JAVA部分字节码

上次听说吧,好像finally能覆盖return 嗯?在我学习中从来没有return后还能执行的东西。感觉有点儿见鬼。想看看它的机器码长什么样子?
我想知道究竟是在函数中return后又执行的finally的return?还是一起执行取finally作为结果?还是只执行finally的return?
不幸的是JAVA使用了JAVA字节码而不是汇编,但看起来好像理解了汇编这也没什么难的.
嘛,幸运的是我只想看看JAVA字节码finally双返回是怎么编译的,了解一点儿就行了。

二.反编译java语言到字节码

finally自带返回 了覆盖try中返回

JDK自带强大的工具,cmd中javap 类名就可以反编译。
我先写一段简单的try-catch-finally试一下。
这个逻辑我让finally返回

package test;

import java.util.*;

public class Test {

    public boolean method()
    {
    	try
    	{
    		return false;
    	}catch (Exception a)
    	{
    		return true;
    	}
    	finally
    	{
    		return true;
    	}
    }

}

逻辑简单到令人发指
javac Test.java 先编译
javap Test 再反编译

public class test.Test {
  public test.Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public boolean method();
    Code:
       0: iconst_0
       1: istore_1
       2: iconst_1
       3: ireturn
       4: astore_1
       5: iconst_1
       6: istore_2
       7: iconst_1
       8: ireturn
       9: astore_3
      10: iconst_1
      11: ireturn
    Exception table:
       from    to  target type
           0     2     4   Class java/lang/Exception
           0     2     9   any
           4     7     9   any
}

额,虽然我看不懂具体意思,但三个return 我还是看得到的。
3,8,11行都有返回语句。try-catch-finally的返回
但底下的异常表,根据
0-2行中出现exception类转到第4行。这应该就是我catch的exception.
0-2行应该是我的try块儿。
0-2行无论出现什么情况都会转到第9行。
意味着try块儿中的第三行return 其实被跳过了。
下面考虑0-2出现异常转到第4行
根据异常表4-7行也在任何情况跳转到第9行
那么第8行return 也被跳过了。
所以无论在什么情况都会跳过这几个return只有finally的return 会执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值