结果:
- finally 块中的代码都会执行
- try 和catch 中有return时,finally依然会执行
- return 在try catch 中的,返回值是 return运算后的值,finally 是在return 表达式运算后 执行的(但是不会返回finally运算后的值,而是先把return 运算后要保存的值存起来,不管finally 中的代码块这么执行,返回值都不会改变,任然返回return 运算后的值),因此return 返回值不会随着finally的改变而改变。
- finally 中最好不要包含return,否则程序会提前提出,返回值不是try,catch中保存的返回值。
案例:
-
try{} catch(){}finally{} return; -------------------------------- 顺序执行
-
try{ return; }catch(){} finally{} return; -------------------------------- 程序执行try块中return之前(包括return语句中的表达式运算)代码; 再执行finally块,最后执行try中return; finally块之后的语句return,因为程序在try中已经return所以不再执行。
-
try{ } catch(){return;} finally{} return; -------------------------------------- 程序先执行try,如果遇到异常执行catch块, 有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后也就是4处的代码不再执行。 无异常:执行完try再finally再return.
-
try{ return; }catch(){} finally{return;} -------------------------------------- 程序执行try块中return之前(包括return语句中的表达式运算)代码; 再执行finally块,因为finally块中有return所以提前退出。
-
try{} catch(){return;}finally{return;} ----------------------------------------- 程序执行catch块中return之前(包括return语句中的表达式运算)代码; 再执行finally块,因为finally块中有return所以提前退出。
-
try{ return;}catch(){return;} finally{return;} ------------------------------------------- 程序执行try块中return之前(包括return语句中的表达式运算)代码; 有异常:执行catch块中return之前(包括return语句中的表达式运算)代码; 则再执行finally块,因为finally块中有return所以提前退出。 无异常:则再执行finally块,因为finally块中有return所以提前退出。
public class Demo {
public static String m1(){
String str="";
try{
str = "Hello";
return str;
}catch (Exception e){
str = "Exception";
return str;
}finally{
str = "haha";
}
}
public static void main(String[] args) {
System.out.println(m1());
}
}
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。 在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果, 因此,即使finally中对变量x进行了改变,但是不会影响返回结果。 它应该使用栈保存返回值