try与finally块中return的问题

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

0GqLl|0t)F"a-l0以前面试有人问过我这个问题,今天在网上看到相关的文章,因为自己也不甚理解所以自我测试,也对网上一些测试结果发表一些看法!51Testing软件测试网C#P`Qx4^ ^$E6?
情况1:try{} catch(){} finally{} return;

"rpnaFdD;aFS`0
  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. p L&qG-bg0I0

K*MR{].}\,`6A0显然程序按顺序执行,最后return 101退出51Testing软件测试网2VMkv UJ
结果:

_.M7`'g)|e/]0q0
  1. yes
  2. b>25 :111
  3. finally
  4. 101

I4f j8c6MC0情况2:try{ return; } catch(){} finally{} return;51Testing软件测试网{2n i;z? U:c }f.U,Q4}

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

-f*I9_nVq0程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行try中return;51Testing软件测试网R$b4qk7A\r
finally块之后的语句,这里的4处return,因为程序在1处已经return所以不再执行。51Testing软件测试网H @'N2G-x&_ m
结果:51Testing软件测试网l~X'rP

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

*I"s4q#FC:m0情况3:try{ } catch(){ return;} finally{} return;

PTa.gM1IP^]K0
  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. }
51Testing软件测试网c)l!K}H~X D(d,_

程序先执行try,如果遇到异常执行catch块,
T` qN+zjn1VJ0V0    有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行51Testing软件测试网a,{Y#^H3}(t4Z
catch块中return. finally之后也就是4处的代码不再执行。51Testing软件测试网O+t IC%gH
    无异常:执行完try再finally再return.
.{9G`Jr7JB1s M/`V0结果:本次为无异常结果(当然本示例没有设计异常)51Testing软件测试网#T"H%VLlz/i

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

Sv`n[@3wG;[#g0情况4:try{ return; } catch(){} finally{return;}

8E4X]i'v0
  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软件测试网Tja1jLX8[

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

*L0C%L|/J+F&InH4j0
  1. yes
  2. b>25 :111
  3. finally
  4. 100
51Testing软件测试网qTF+|#_9vE r5U6`


w0C n!P?}l$P[1[ C7X0情况5:try{} catch(){return;} finally{return;}51Testing软件测试网e+Ur Kc\

  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. }
51Testing软件测试网LN\ L vt

程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出51Testing软件测试网$b9n&A4gS8y(a
结果:

J$O&Aw6Xy v4\0
  1. yes
  2. b>25 :111
  3. finally
  4. 100
51Testing软件测试网wL`H(d[ |

51Testing软件测试网;Kt DA+X-?N'l
情况6:try{ return;} catch(){return;} finally{return;}51Testing软件测试网6fL Y(r Az(F"J

  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软件测试网lX7^7T2WS$n

程序执行try块中return之前(包括return语句中的表达式运算)代码;
5g;M&T4[Q7|7`#xE0   有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出51Testing软件测试网5N;B"[;M9V3`oq4m
   无异常:则再执行finally块,因为finally块中有return所以提前退出51Testing软件测试网,{f\$b{'R J7?{v
无异常结果:51Testing软件测试网{"v7C'A \h.L

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

^"B7M:l t;w(M n X051Testing软件测试网 B})LiC"x
以下情况51Testing软件测试网l ~Hb4o
情况1:try{} catch(){} finally{} return;51Testing软件测试网 F`Y3K&cjG:my
情况2:try{ return; } catch(){} finally{} return;
\}rF6_y1G0情况3:try{} catch(){ return;} finally{} return;
`LJT-Qrk0情况4:try{ return; } catch(){} finally{return;}51Testing软件测试网e5[*o8tg}2G4I|
情况5:try{} catch(){return;} finally{return;}51Testing软件测试网+ojRU GO@]z
情况6:try{ return;} catch(){return;} finally{return;}
w2u2\WN d:l0|%k0
c#_gvb$a(N&\0以上几种情况说明:
2BO.j^zl0一、如果try catch finally块均无return则执行最后finally外的return;如果try catch finally中任何一个有return则最后finally外的return不再执行;
+q ]U @*]8S"] o0二、只要finally块中有return则try或catch中的return不再执行
(X D(o`B$^l0
G h[%~t2d!Z0以下几种情况在finally块的后面是不能出现return的。
,e8?k|8?[&m0情况:try{} catch(){} finally{ return;} return;51Testing软件测试网!`q*T_u9\{
情况:try{ return; } catch(){} finally{return;} return;
1s)XONo2{.G0情况:try{} catch(){return;} finally{return;} return;51Testing软件测试网$uvoLjg
情况:try{ return; } catch(){return;} finally{} return;
"NI y4O4T+U a0情况:try{ return; } catch(){return;} finally{return;} return;51Testing软件测试网k6Z7n&xaN
51Testing软件测试网c ['M IKL,v8C7VjK
上面几种情况因为finally块中已有return,而且是必须执行的,所以finally外的return必定不能执行,所以编译器提示错误。特殊的 try{ return; } catch(){return;} finally{} return;是因为try和catch中都有return所以必定会执行其中一个,所以finally外的return不能执行,所以编译器提示错误。
S7k*YB@-\2Z051Testing软件测试网,Nt)nf'G5}hw
还有一种情况:51Testing软件测试网)HgU4l o(U\h
51Testing软件测试网_u_h e,~7b'zc
51Testing软件测试网.nrn.sqC-h
最终结论:任何调用try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。51Testing软件测试网2?bz$Cx6Z*Y


TAG: java JAVA 异常处理

 

评分:0

我来说两句

Open Toolbar