try与finally块中return的问题

上一篇 / 下一篇  2009-09-03 15:59:43 / 个人分类:JAVA

+{c/U#E\!^6d0以前面试有人问过我这个问题,今天在网上看到相关的文章,因为自己也不甚理解所以自我测试,也对网上一些测试结果发表一些看法!51Testing软件测试网 G s,x8~1u%juNc
情况1:try{} catch(){} finally{} return;51Testing软件测试网 vQ"r HC2^)r6n AY

  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. }
  23. 51Testing软件测试网j$R6C S4i;M'M
51Testing软件测试网!K(?b2A2I;a~*w

显然程序按顺序执行,最后return 101退出51Testing软件测试网;Oj?c.kc
结果:

vK0z#BK v\g,Q.Ur8|0
  1. yes
  2. b>25 :111
  3. finally
  4. 101
51Testing软件测试网 \@&kH}+r QX$Z5u

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

&JE~s IW!^*X$M"j2~R0
  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. }
51Testing软件测试网&cS {@t

程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行try中return;51Testing软件测试网Z4H9Rs0Y{$P
finally块之后的语句,这里的4处return,因为程序在1处已经return所以不再执行。
L3gw6A:S\0结果:51Testing软件测试网@%b Ssp5{zi

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

F-sh _0M"u;UW@~qL0情况3:try{ } catch(){ return;} finally{} return;51Testing软件测试网bhS7B3V7J

  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. }

Ys8_KXn+G6Q8]M0程序先执行try,如果遇到异常执行catch块,
IpqhHkiu9W M ],z k0    有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行
d$iu"N)mi2?@ gc7^?0catch块中return. finally之后也就是4处的代码不再执行。51Testing软件测试网"M4Bj8qQ(X])b,\
    无异常:执行完try再finally再return.
A)pV7h%Q z0tg0结果:本次为无异常结果(当然本示例没有设计异常)51Testing软件测试网'EAN v&w%^ t9O~

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

(N5IY&p{ ~p7w*H3A6~0情况4:try{ return; } catch(){} finally{return;}51Testing软件测试网k:[ {;G4g Y }*D

  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. }
51Testing软件测试网V^a@5W6Q H

程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
o"{Y)Xmh\y7I)p0结果:51Testing软件测试网Cc8Q{*P My

  1. yes
  2. b>25 :111
  3. finally
  4. 100
51Testing软件测试网Lk%b0d;Q!L5kP.W^"Y


'U aYACX["yt0情况5:try{} catch(){return;} finally{return;}51Testing软件测试网gZ)AySu,K5ex:H

  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. }

0h4Q*A7LA i'V0程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
v.^6p{g{5k0结果:51Testing软件测试网r(M!m pFp D

  1. yes
  2. b>25 :111
  3. finally
  4. 100
51Testing软件测试网,\!NmDM?/f#iJ }


;b:J`OT;V0情况6:try{ return;} catch(){return;} finally{return;}

ir|3D$qf0
  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. }
51Testing软件测试网%wa+C{N o&[

程序执行try块中return之前(包括return语句中的表达式运算)代码;
s(a#yq8@cVF0   有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出51Testing软件测试网 ht7H&Syn-Oo9B ~
   无异常:则再执行finally块,因为finally块中有return所以提前退出51Testing软件测试网 r9^I2GT)M\
无异常结果:

b/S g | t1{ uGD+n0
  1. yes
  2. b>25 :111
  3. finally
  4. 100
51Testing软件测试网\*B;w0CTDW

51Testing软件测试网fP$F4O]Z0W
以下情况
7O}GbG]/Efw0情况1:try{} catch(){} finally{} return;
s(vI&Ma F9RM0情况2:try{ return; } catch(){} finally{} return;51Testing软件测试网n7Rg n]tlV
情况3:try{} catch(){ return;} finally{} return;
nd/UCr"j5p7Lt3d0情况4:try{ return; } catch(){} finally{return;}51Testing软件测试网r@%g#s)FAI[
情况5:try{} catch(){return;} finally{return;}
_^T9}h0情况6:try{ return;} catch(){return;} finally{return;}51Testing软件测试网zaH,NG tB-]7| B)G

g(t;G ^8h-O Ss0以上几种情况说明:51Testing软件测试网 Z U D2toKe
一、如果try catch finally块均无return则执行最后finally外的return;如果try catch finally中任何一个有return则最后finally外的return不再执行;51Testing软件测试网(Od} kE8}
二、只要finally块中有return则try或catch中的return不再执行
K!y3XV5q5O/X;NC}wQ051Testing软件测试网je {&J:`^`2G)@
以下几种情况在finally块的后面是不能出现return的。
`6p,wb s$c6O0情况:try{} catch(){} finally{ return;} return;51Testing软件测试网oHj[e
情况:try{ return; } catch(){} finally{return;} return;51Testing软件测试网aLm3erF
情况:try{} catch(){return;} finally{return;} return;51Testing软件测试网6h-M"k m A3G$N
情况:try{ return; } catch(){return;} finally{} return;51Testing软件测试网U!j&q-g(w~4Yq
情况:try{ return; } catch(){return;} finally{return;} return;
mN f#F.MA#K051Testing软件测试网Ju{nL6CX
上面几种情况因为finally块中已有return,而且是必须执行的,所以finally外的return必定不能执行,所以编译器提示错误。特殊的 try{ return; } catch(){return;} finally{} return;是因为try和catch中都有return所以必定会执行其中一个,所以finally外的return不能执行,所以编译器提示错误。
_l0F gqA-Us051Testing软件测试网JMr6jW5U;UlX| g
还有一种情况:51Testing软件测试网%gCk:zz5l
51Testing软件测试网$E-l,rP:C+| yJ
51Testing软件测试网:S%vE%B crKw
最终结论:任何调用try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。

~?4C/h*]R"^0

TAG: java JAVA 异常处理

 

评分:0

我来说两句

日历

« 2022-01-14  
      1
2345678
9101112131415
16171819202122
23242526272829
3031     

数据统计

  • 访问量: 37919
  • 日志数: 47
  • 建立时间: 2009-09-03
  • 更新时间: 2010-06-10

RSS订阅

Open Toolbar