根据 Java 语言规范,第 §14.20.2 节
带有finally 块的try 语句首先执行try 块。然后就有一个选择:
- If execution of the try block completes normally, then the finally
block is executed, and then there is a choice:
- 如果finally 块正常完成,则try 语句也正常完成。
- 如果finally 块由于原因S 突然完成,则try 语句也会由于原因S 突然完成
如果我正确解释它,那么在执行 try 块后,finally 就会被调用,但是这一切是如何工作的以及为什么我得到输出,
public static int TestTryFinallyBlock()
{
int i =0;
try
{
i= 10; //Perform some more operation
return i;
}
finally
{
i = 40;
}
}
public static void main( String[] args )
{
int i1 = TestTryFinallyBlock(); //Here the output was 10 not 40
}
我想知道这个东西是如何产生输出10的。
就是当执行try块时,遇到return语句,输出值已经入栈,然后执行finally块
我知道首先遇到 return,然后finally 块运行,因此输出为 10,但是jvm 如何解释或 jvm 如何处理或转换 try finally 块?
是jvm使用GOTO节跳转节到finally节还是栈已经维护好了?
经过一番搜索并查看生成了哪些字节码后,我发现实际上并没有看起来的finally块,也没有JVM生成的jump或goto语句。
上面的代码被翻译为(如果我正确解释字节码,如果我错了请纠正我)
public static int TestTryFinallyBlock()
{
int returnValue; //A temporary return variable
try
{
int i = 0;
i = 10;
returnValue = i;
i = 40;
return returnValue;
}
catch (RuntimeException e)
{
i = 40; //finally section code id copied here too
throw e;
}
}
注意事项: If 'i'
将是对可变类对象的引用,并且该对象的内容在finally块中被更改,那么这些更改也将反映在返回值中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)