情况一:try{} catch(){} finally{} return;
程序按正常顺序执行。
情况二:try{return} catch(){} finally{} return;
程序先执行try块中return之前的代码,再执行finally块中的代码,最后执行try块中的return。需要注意的是finally块中的代码无法影响try块中的return值,比如说:
private int i;
private int test() {
try {
i++;
return i;
} catch (Exception e) {
e.printStackTrace();
return i;
} finally {
i++;
}
}
即使在final块中执行了i++,但并不会影响try块中的返回值,即test方法返回1,但此时i=2。
情况三:try{ return } catch(){} finally{return}
程序执行try块中return之前(包括return语句中的表达式运算)代码,再执行finally块,因为finally块中有return所以提前退出,而不会执行try块中return。编译器把finally中的return实现为一个warning。
除此之外,在catch块中return以及有异常的情况下,也是同样的道理。
总结
任何执行try块或者catch块中的return语句之前,都会先执行finally语句, 如果finally中有return语句,那么就直接return了,不去执行try 块或者catch块中的return;如果finally块没有return语句,finally块是无法影响try块或者catch块中的return值的。