try,finally中都有return时程序的执行顺序

 在Java中当try、finally语句中包含return语句时,执行情况到底是怎样的,finally中的代码是否执行,大家各有各的说法,刚好今天有个朋友问了我这个问题,下面我就提供两段代码,详细解释一下~

这是第一种情况:try代码块中包含return语句,finally代码块中不包含return语句;

java代码如下:

[java] view plain copy

  1. package Exception;  
  2. public class Test02 {  
  3. public static void main(String[] args) {  
  4.             System.out.println(test());  
  5.     }  
  6. public static int test(){  
  7. try{  
  8. int i=1;  
  9. return i;  
  10.             }  
  11. finally{  
  12. int i=2;  
  13.                 System.out.println(i);  
  14.             }  
  15.     }  
  16. }  

这里我们在try代码块中定义了 i=1; 并设定了return的返回值为i;

在finally代码块中为设置返回值,但同样的输出了i;

结果为

Java代码:

[java] view plain copy

  1. 2
  2. 1

结果显示:finally代码块里如果没有return,finally代码块会优先在try代码块里的return前执行;

第二种情况是:try代码块和finally代码块中都有return语句

这也是我们需要重点讨论的地方;

java代码如下:

[java] view plain copy

  1. package Exception;  
  2. public class Test01 {  
  3. public static void main(String[] args) {  
  4.         System.out.println(test());  
  5.     }  
  6. public static int  test(){  
  7. try{  
  8. int i = 1;  
  9. return i;  
  10.            }  
  11. finally{  
  12. int j = 2;  
  13. return j;  
  14.         }  
  15. }     
  16. }  

这次我在try语句块和finally语句块中都加入了return语句,猜猜会输出什么结果?i = 1?还是 i = 2 ?

还是让程序告诉我们答案吧!

java代码如下:

[java] view plain copy

  1. 2

有的小伙伴就说了,肯定会输出2啊!程序里有try-catch结构时,代码块里如果有finally代码块,无论如何都会执行finally代码块,上面这段代码

finally代码块里有一个return,在执行finally的return方法时,程序的结果就返回了。所以主程序输出的是2。

恭喜这位小伙伴~你答对了结果~  但程序的运行过程不是这样的哦。

讲解如下:

主程序在调用test方法的时候会先执行try代码块里的代码,并先return  i=1;但并不会直接把return的结果返回给主函数,而是在暂时储存在栈空间里;

口说无凭!那就让神奇的debug看告诉我们事实,在MyEclipse中用debug进行调试会发现,程序会先执行try代码块里的i=1;此时紧接着会马上return    i=1; 事实见下图。

然后再执行finally代码块中的 代码, int  j = 2;  return j ; 此时执行完finally代码块的return j ; 后 ,程序就结束了,并不会再去执行返回try代码块中在栈空间里存储的 i=1;

栈空间里的 i = 1 ;  随着程序的结束 也就自动消失了~

这两个例子的结论就是:

1.如果try代码块里有return语句,而finally代码块里没有return语句,程序会先执行finally代码块里的代码然后再执行try代码块里的return语句;

2.如果try代码块和finally代码块里都有return语句,try代码块里的return语句会优先finally代码块里的return语句执行,但不会把返回的结果返回给主函数,

而是会把finally代码块里return的结果返回给主函数。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

《Redis设计与实现》读书笔记(五) ——Redis中的整数集合

《Redis设计与实现》读书笔记(五) ——Redis中的整数集合 (原创内容,转载请注明来源,谢谢) 一、概述 整数集合(intset)是redis数据结构集...

3464
来自专栏九彩拼盘的叨叨叨

JS模式 之通用模式(译)

原文 http://shichuan.github.io/javascript-patterns/

1073
来自专栏C/C++基础

C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解

模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程。对于函数模板而言,模板实例化之后,会生成一个真正的函数。而类模板经过实例化之后,只是完成了类的定义...

1692
来自专栏Python专栏

17个案例带你3分钟搞定Linux正则表达式

来源:https://blog.ansheng.me/article/examples-of-linux-regular-expressions

1643
来自专栏流媒体

C++ string

852
来自专栏python读书笔记

《算法图解》NOTE 2 数组、链表及选择排序1.数组2.链表3.选择排序法

1383
来自专栏nummy

python双端队列deque

由于deque是一种序列容器,因此同样支持list的一些操作,如用getitem()检查内容,确定长度,以及通过匹配标识从序列中间删除元素。

832
来自专栏前端儿

大小写互换

  现在给出了一个只包含大小写字母的字符串,不含空格和换行,要求把其中的大写换成小写,小写换成大写,然后输出互换后的字符串。

1312
来自专栏北京马哥教育

17个案例带你3分钟搞定Linux正则表达式

正则表达式是一种字符模式,用于在查找过程中匹配制定的字符。 元字符通常在Linux中分为两类: Shell元字符,由Linux Shell进行解析; 正则表达式...

3524
来自专栏用户2442861的专栏

深入 char * ,char ** ,char a[ ] ,char *a[] 内核

http://blog.csdn.net/daiyutage/article/details/8604720

1812

扫码关注云+社区

领取腾讯云代金券