博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
J2SE基础夯实系列之finally中return语句
阅读量:4362 次
发布时间:2019-06-07

本文共 4716 字,大约阅读时间需要 15 分钟。

   最终结论:try,catch,还有finally语句中,finally中的return会覆盖try或者catch中的return!!    

如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。

以前面试有人问过我这个问题,今天在网上看到相关的文章,因为自己也不甚理解所以自我测试,也对网上一些测试结果发表一些看法!

情况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.          
  20.          return 101;             //---4
  21.     }
  22. }

显然程序按顺序执行,最后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.          
  21.          return 101;             //---4
  22.     }
  23. }

程序执行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.          
  21.          return 101;             //---4
  22.     }
  23. }

程序先执行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.     }
  23. }

程序执行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.     }
  23. }

程序执行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.     }
  24. }

程序执行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。

转载于:https://www.cnblogs.com/allenzhaox/archive/2012/08/06/3201861.html

你可能感兴趣的文章
sublime text3
查看>>
WPF 反编译后错误处理
查看>>
varnish基础
查看>>
3.3-3.9 周记
查看>>
博客换肤
查看>>
HDU 5025Saving Tang Monk BFS + 二进制枚举状态
查看>>
Web Magic 总体架构
查看>>
Scikit-Learn机器学习入门
查看>>
完美解决IE8有两个进程的问题
查看>>
jq的链式调用.end();
查看>>
不要怂,就是GAN (生成式对抗网络) (五):无约束条件的 GAN 代码与网络的 Graph...
查看>>
单击浏览器右上角的X弹出提示窗口
查看>>
BZOJ1734: [Usaco2005 Feb]Aggressive cows 愤怒的牛
查看>>
开始python之旅
查看>>
Python进阶06 循环对象
查看>>
Python补充06 Python之道
查看>>
.net压缩文件夹
查看>>
MS SQL 分页存储过程
查看>>
2016年,我的和自己谈谈
查看>>
创建一个自己的GitHub,创建自己的开源项目
查看>>