try catch finally的底层原理
Posted xhmj12
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了try catch finally的底层原理相关的知识,希望对你有一定的参考价值。
来源:https://blog.csdn.net/lwd512768098/article/details/114728720
finally终究执行
public static int test()
int i = 1;
try
i++;
finally
System.out.println("finally yeah!");
return i;
public static void main(String[] args)
System.out.println(test());
输出为
public static int test()
int i = 1;
try
i++;
throw new Exception();
catch (Exception e)
System.out.println("Exception yeah!");
finally
System.out.println("finally yeah!");
return i;
public static void main(String[] args)
System.out.println(test());
从上面两个例子中我们可以看到,无论是正确运行try块还是在try块发生了异常,finally块都是被执行的。搜索公众号互联网架构师回复“2T”,送你一份惊喜礼包。
带有return的情况
finally不带return的情况
对于return情况的话,只要记住一句话就行,如果finally里面有return, 那么就会覆盖try块或者catch里面的return内容,否则的话,在执行finally的内容之前(try块或者catch里面有return语句),会计算好try或者catch里面的return表达式的值,然后保存到另一个局部变量,当执行fianlly的时候,会重新加载这个局部变量作为返回值,因此在finally的操作不会影响返回值,下面我们字节码来看看内部的工作原理。
public static int test()
int i = 1;
try
i++;
return i;
finally
i++;
System.out.println("finally yeah!");
public static void main(String[] args)
System.out.println(test());
第一个问题:在try块中含有return语句,你觉得finally语句还有执行么?
第二个问题:最终结果是多少?
从上面可以看到,尽管try块里面有return, 但是finally块仍然执行了,你肯定会好奇,那为啥返回值是2呢,finally里面不是还进行了i++么。搜索公众号互联网架构师回复“2T”,送你一份惊喜礼包。
简单分析一下,从结果看,finally仍然执行,说明try的return语句是还没执行的,下面我们看看字节码。
上面图片已经标注很清楚了,如果还不明白的话,可以先去看一下这几个字节码命令,还是挺简单的,注意的是,JVM操作都是基于操作数栈的。
finally带有return
上面的情况是try或者catch里面含有return,finally没有return, 那么fianlly里面如何修改返回值是不会影响最后的返回值。下面讨论finally里面含有return的情况。
public static int test()
int i = 1;
try
i++;
return i;
finally
i++;
System.out.println("finally yeah!");
return i;
public static void main(String[] args)
System.out.println(test());
没错,返回了3,说明finally对i的修过是其效果的,我们从字节码看看原因:
从上图可以看到,在返回之前,加载的是0槽位的变量,这时0槽位的变量的值是3,1槽位的变量是2,所以返回的3。
由上可以得知,当finally中含有return的时候,会覆盖之前try或者catch(上面没有贴出实验,需要验证的可以去验证,作者本人是验证过了)里面的返回值的。搜索公众号互联网架构师回复“2T”,送你一份惊喜礼包。
try, catch, finally均没有return语句
public static int test()
int i = 1;
try
i++;
finally
i++;
System.out.println("finally yeah!");
return i;
public static void main(String[] args)
System.out.println(test());
总结
这里总结一下,只要finally里面没有return语句,那么返回值就由try或者catch的return语句决定,否则由finally的return语句决定
PS:如果觉得我的分享不错,欢迎大家随手点赞、转发、在看。
以上是关于try catch finally的底层原理的主要内容,如果未能解决你的问题,请参考以下文章
java中的“try - catch -finally”结构中的“finally”都有哪些用途
try-catch-finally 中哪个部分可以省略?try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?