刚才在一个人的blog中看到一个关于java中的finally里的语句在什么时候执行的文章,感觉还是挺有收获的,现在就把他的大致意思以及自己的验证和大家分享下
在java的API中,关于的finally的介绍是无论异常处理try-catch语句是否抛出异常,finally中的语句都会执行。因此我们可以在finally语句中做很多必须要做的操作,比如流关闭、链接关闭等。
但是有个问题,如果try最后return语句,那finally里的语句又是什么时候去执行呢?
这个问题先不回答,我们先看下面几个测试用例,看完之后也许你就知道了点什么。
/** *@Description: 关于finally的测试 */ package cn.lulei.test; public class Test { public int testFinally(){ int x = 1; try{ return x; } catch (Exception e) { e.printStackTrace(); return -1; } finally { x++; System.out.println("x = " + x); } } public static void main(String[] args) { System.out.println("testFinally:" + new Test().testFinally()); } }
输出结果是:
x = 2
testFinally:1
/** *@Description: 关于finally的测试 */ package cn.lulei.test; public class Test { @SuppressWarnings("finally") public int testFinally(){ try{ return function1(); } catch (Exception e) { e.printStackTrace(); return -1; } finally { return function2(); } } private int function1(){ System.out.println("function1"); return 1; } private int function2(){ System.out.println("function2"); return 2; } public static void main(String[] args) { System.out.println("testFinally:" + new Test().testFinally()); } }
输出结果是:
function1
function2
testFinally:2
看完这两个测试用例,是不是感觉finally中的语句好在try中的return语句之前,又好像在try中的return语句之后。其实finally中的语句更确切的说是在return中间运行的,这里也许你会说,return语句明显就是一步,哪里来的中间,不错,是没有中间,但是如果从整体来看,也许就“有了”,下面就简单分析下:
A函数调用B函数并得到结果的过程,就好比A函数准备好了一个空罐子,当B函数要返回结果时,先把结果放在罐子里①,然后再将程序逻辑返回到A函数②。所谓的返回,就是B函数说,我不运行了,你A函数继续运行吧。这时我们再回头看一下上面的测试用例,第一个没有什么好说的,B把1放到罐子里,又运行了若干操作,最后告诉A函数继续运行,所以得到上图的结果;第二个也是一样,B函数先把1放到罐子里,然后继续运行一些操作,这时B发现该把2放到罐子里的,因此又把罐子里的值换成2,最后告诉A函数继续运行,所以A函数得到的返回值是2而不是1。所以实际上,当罐子里面有值的时候,B并不是立即通知A,而是等finally里面的语句全部执行完之后,采去通知A的,这样解释return就相当于有中间了。
相关推荐
17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句.zip17.javatry…catch…finally语句...
finally语句块与return的执行关系
关于Java中finally语句块的深度辨析.doc
Java语言finally语句详解,finally到底是在return之前还是之后执行.zip
Delphi异常处理try_except语句和try_finally语句用法以及区别.pdf Delphi异常处理try_except语句和try_finally语句用法以及区别.pdf
- 无论try是否发生异常,finally语句都会执行- 如果try/catch中包含控制转移语句(return、continue、break),finally
try...catch...finally语句的相关案列
2.3 try-except-else-finally 语句 2.4 小结 三、异常抛出 (Exception raising) 四、异常自定义 (Exception customizing) 五、预定义的清理行为 (with 语句) 六、断言 (Asserting) 七、小结 (Summary) 一、绪论 ...
第一:return语句并不是函数的终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回) 第二:finally里面不建议放return语句,根据需要,return语句...
主要介绍了讲解Java编程中finally语句的基本使用方法,finally在异常处理中的使用时Java入门学习中的基础知识,需要的朋友可以参考下
主要介绍了Powershell中Finally语句用法示例,本文用一个播放音乐的脚本为例子,使用Finally语句在异常结束操作时执行清理操作,需要的朋友可以参考下
NULL 博文链接:https://seaizon.iteye.com/blog/2066983
主要深度介绍了Java编程中finally语句的执行原理,细致讲解了finally在异常处理中的流程控制作用,需要的朋友可以参考下
主要介绍了C#异常处理中try和catch语句及finally语句的用法示例,finally语句的使用涉及到了C#的垃圾回收特性,需要的朋友可以参考下
try-finally语句是Microsoft对C和C++语言的扩展,它能使32位的目标程序在异常出现时,有效保证一些资源能够被及时清除,这些资源的清除任务可以包括例如内存的释放,文件的关闭,文件句柄的释放等等。try-finally...
关于python的with语句使用,学习Python有一段时间了,最近做一个项目会涉及到文件的读取和关闭。比如:我想把一些对象序列化到文件里面,然后当我再次使用的时候,在从文件 里面读取反序列化成对象。像这种操作一般都...
下面小编就为大家带来一篇浅谈Java finally语句到底是在return之前还是之后执行(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了关于Java中try finally return语句的执行顺序浅析,需要的朋友可以参考下
我们知道return语句用在某一个方法中,一是用于返回函数的执行结果,二是用于返回值为void类型的函数中,仅仅是一个return语句(return ;),此时用于结束方法的执行,也即此return后的语句将不会被执行,当然,这种...
Java的 try 与 catch finally关键字的使用