针对以下情况进行测试:
情况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;}
情况1:try{} catch(){} finally{} return;
package com.lwf.eus.servlet;
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
b += 88;
} catch (Exception e) {
System.out.println("error:" + e);
} finally {
if (b > 25) {
System.out.println("b>25:" + b);
}
System.out.println("finally");
}
return 101;// ---4
}
}
显然程序按顺序执行,最后return 101退出
结果:
yes
b>25:111
finally
101
情况2:try{ return; } catch(){} finally{} return;
package com.lwf.eus.servlet;
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
return b += 88;//---1
} catch (Exception e) {
System.out.println("error:" + e);
} finally {
if (b > 25) {
System.out.println("b>25:" + b);
}
System.out.println("finally");
}
return 101;// ---4
}
}
程序执行try块中return之前的代码,并执行return语句中的表达式运算;之后再执行finally块,最后执行try中return; finally块之后的语句---4处的return,因已在1处return而中断,不再执行。
结果:
yes
b>25:111
finally
111
情况3:try{ } catch(){ return;} finally{} return;
package com.lwf.eus.servlet;
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
b += 88;//---1
} catch (Exception e) {
System.out.println("error:" + e);
return b;//---2
} finally {
if (b > 25) {
System.out.println("b>25:" + b);
}
System.out.println("finally");
}
return 101;// ---4
}
}
程序先执行try,如果遇到异常执行catch块,
有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。
无异常:执行完try再finally再return.
结果:本次为无异常结果(当然本示例没有设计异常)
yes
b>25:111
finally
101
情况4:try{ return; } catch(){} finally{return;}
package com.lwf.eus.servlet;
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
return b += 88;//---1
} catch (Exception e) {
System.out.println("error:" + e);
} finally {
if (b > 25) {
System.out.println("b>25:" + b);
}
System.out.println("finally");
return 101;// ---4
}
}
}
序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
结果:
yes
b>25:111
finally
101
情况5:try{} catch(){return;} finally{return;}
package com.lwf.eus.servlet;
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
b += 88;//---1
throw new Exception();
} catch (Exception e) {
System.out.println("error:" + e);
return b+=100; // ---2
} finally {
if (b > 25) {
System.out.println("b>25:" + b);
}
System.out.println("finally");
return b;// ---4
}
}
}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出
结果:
yes
error:java.lang.Exception
b>25:211
finally
211
况6:try{ return;} catch(){return;} finally{return;}
有异常且异常发生在try的return之前:程序执行try块中return之前代码(不包括retrun语句中的表达式运算),再执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出
测试代码如下:
package com.lwf.eus.servlet;
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
b += 88;//---1
if(b>0){
throw new Exception();
}
return b+=10;
} catch (Exception e) {
System.out.println("error:" + e);
return b+=100; // ---2
} finally {
if (b > 25) {
System.out.println("b>25:" + b);
}
System.out.println("finally");
return b;// ---4
}
}
}
结果:
error:java.lang.Exception
b>25:211
finally
211
有异常且异常发生在try的return语句时:程序执行try块中return之前(包括return语句中的表达式运算)代码,执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出
测试代码如下:
package com.lwf.eus.servlet;
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
b += 88;//---1
return 2/0;
} catch (Exception e) {
System.out.println("error:" + e);
return b+=100; // ---2
} finally {
if (b > 25) {
System.out.println("b>25:" + b);
}
System.out.println("finally");
return b;// ---4
}
}
}
结果:
yes
error:java.lang.ArithmeticException: / by zero
b>25:211
finally
211
无异常:程序执行try块中return之前(包括return语句中的表达式运算)代码,再执行finally块,因为finally块中有return所以提前退出
测试代码如下:
package com.lwf.eus.servlet;
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
b += 88;//---1
return 1;
} catch (Exception e) {
System.out.println("error:" + e);
return b+=100; // ---2
} finally {
if (b > 25) {
System.out.println("b>25:" + b);
}
System.out.println("finally");
return b;// ---4
}
}
}
结果:
yes
b>25:111
finally
111
以上几种情况说明:
一、如果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。
有关异常机制参见:深入理解java异常处理机制