打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
try与finally块中return的问题

以前面试有人问过我这个问题,今天在网上看到相关的文章,因为自己也不甚理解所以自我测试,也对网上一些测试结果发表一些看法!
情况1:try{} catch(){} finally{} return;

  1. package com.lwf.eus.servlet;
  2. public class Test{
  3. public static void main(String[] args){
  4. System.out.print(tt());
  5. }
  6. public static int tt(){
  7. int b = 23;
  8. try{
  9. System.out.println("yes");
  10. b += 88;
  11. }catch(Exception e){
  12. System.out.println("error :" + e);
  13. }finally{
  14. if(b>25){
  15. System.out.println("b>25 :"+b);
  16. }
  17. System.out.println("finally");
  18. }
  19. return 101; //---4
  20. }
  21. }

显然程序按顺序执行,最后return 101退出
结果:

  1. yes
  2. b>25 :111
  3. finally
  4. 101

情况2:try{ return; } catch(){} finally{} return;

  1. package com.lwf.eus.servlet;
  2. public class Test{
  3. public static void main(String[] args){
  4. System.out.print(tt());
  5. }
  6. public static int tt(){
  7. int b = 23;
  8. try{
  9. System.out.println("yes");
  10. b += 88;
  11. return b; //---1
  12. }catch(Exception e){
  13. System.out.println("error :" + e);
  14. }finally{
  15. if(b>25){
  16. System.out.println("b>25 :"+b);
  17. }
  18. System.out.println("finally");
  19. }
  20. return 101; //---4
  21. }
  22. }

程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行try中return;
finally块之后的语句,这里的4处return,因为程序在1处已经return所以不再执行。
结果:

  1. yes
  2. b>25 :111
  3. finally
  4. 111

情况3:try{ } catch(){ return;} finally{} return;

  1. package com.lwf.eus.servlet;
  2. public class Test{
  3. public static void main(String[] args){
  4. System.out.print(tt());
  5. }
  6. public static int tt(){
  7. int b = 23;
  8. try{
  9. System.out.println("yes");
  10. b += 88;
  11. }catch(Exception e){
  12. System.out.println("error :" + e);
  13. return b; //---2
  14. }finally{
  15. if(b>25){
  16. System.out.println("b>25 :"+b);
  17. }
  18. System.out.println("finally");
  19. }
  20. return 101; //---4
  21. }
  22. }

程序先执行try,如果遇到异常执行catch块,
有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行
catch块中return. finally之后也就是4处的代码不再执行。
无异常:执行完try再finally再return.
结果:本次为无异常结果(当然本示例没有设计异常)

  1. yes
  2. b>25 :111
  3. finally
  4. 101

情况4:try{ return; } catch(){} finally{return;}

  1. package com.lwf.eus.servlet;
  2. public class Test{
  3. public static void main(String[] args){
  4. System.out.print(tt());
  5. }
  6. public static int tt(){
  7. int b = 23;
  8. try{
  9. System.out.println("yes");
  10. b += 88;
  11. return b; //---1
  12. }catch(Exception e){
  13. System.out.println("error :" + e);
  14. }finally{
  15. if(b>25){
  16. System.out.println("b>25 :"+b);
  17. }
  18. System.out.println("finally");
  19. return 100; //---3
  20. }
  21. }
  22. }

程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
结果:

  1. yes
  2. b>25 :111
  3. finally
  4. 100


情况5:try{} catch(){return;} finally{return;}

  1. package com.lwf.eus.servlet;
  2. public class Test{
  3. public static void main(String[] args){
  4. System.out.print(tt());
  5. }
  6. public static int tt(){
  7. int b = 23;
  8. try{
  9. System.out.println("yes");
  10. b += 88;
  11. }catch(Exception e){
  12. System.out.println("error :" + e);
  13. return b; //---2
  14. }finally{
  15. if(b>25){
  16. System.out.println("b>25 :"+b);
  17. }
  18. System.out.println("finally");
  19. return 100; //---3
  20. }
  21. }
  22. }

程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
结果:

  1. yes
  2. b>25 :111
  3. finally
  4. 100


情况6:try{ return;} catch(){return;} finally{return;}

  1. package com.lwf.eus.servlet;
  2. public class Test{
  3. public static void main(String[] args){
  4. System.out.print(tt());
  5. }
  6. public static int tt(){
  7. int b = 23;
  8. try{
  9. System.out.println("yes");
  10. b += 88;
  11. return b; //---1
  12. }catch(Exception e){
  13. System.out.println("error :" + e);
  14. return b; //---2
  15. }finally{
  16. if(b>25){
  17. System.out.println("b>25 :"+b);
  18. }
  19. System.out.println("finally");
  20. return 100; //---3
  21. }
  22. }
  23. }

程序执行try块中return之前(包括return语句中的表达式运算)代码;
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出
无异常:则再执行finally块,因为finally块中有return所以提前退出
无异常结果:

  1. yes
  2. b>25 :111
  3. finally
  4. 100


以下情况
情况1:try{} catch(){} finally{} return;
情况2:try{ return; } catch(){} finally{} return;
情况3:try{} catch(){ return;} finally{} return;
情况4:try{ return; } catch(){} finally{return;}
情况5:try{} catch(){return;} finally{return;}
情况6:try{ return;} catch(){return;} finally{return;}

以上几种情况说明:
一、如果try catch finally块均无return则执行最后finally外的return;如果try catch finally中任何一个有return则最后finally外的return不再执行;
二、只要finally块中有return则try或catch中的return不再执行

以下几种情况在finally块的后面是不能出现return的。
情况:try{} catch(){} finally{ return;} return;
情况:try{ return; } catch(){} finally{return;} return;
情况:try{} catch(){return;} finally{return;} return;
情况:try{ return; } catch(){return;} finally{} return;
情况:try{ return; } catch(){return;} finally{return;} return;

上 面几种情况因为finally块中已有return,而且是必须执行的,所以finally外的return必定不能执行,所以编译器提示错误。特殊的try{ return; } catch(){return;} finally{} return;是因为try和catch中都有return所以必定会执行其中一个,所以finally外的return不能执行,所以编译器提示错误。

还有一种情况:


最终结论:任何调用try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
java try、catch、finally及finally执行顺序详解
Java中try catch finally语句中含有return语句的执行情况(总结版)...
Java finally 语句到底是在 return 之前还是之后执行?
java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
异常
Java异常发生时程序的执行顺序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服