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.          
  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/hzcya1995/p/13318107.html