当finally调用的任何可变API,会修改返回值;当finally调用任何的不可变API,对返回值没有影响。
总结一下:其实return与finally并没有明显的谁强谁弱。在执行时,是return语句先把返回值写入但内存中,然后停下来等待finally语句块执行完,return再执行后面的一段。
类似于
public String fun() {
String s = "10";
try {
return s;
} catch (Exception e) {
return s;
} finally {
s = "20";
}
}
public StringBuffer fun2() {
StringBuffer s = new StringBuffer("20");
try {
return s;
} catch (Exception e) {
return s;
} finally {
s.append("0");
}
}
public String fun3() {
StringBuffer s = new StringBuffer("20");
try {
return s.toString();
} catch (Exception e) {
return s.toString();
} finally {
s.append("0");
}
}
fun()返回20 fun2()返回200 fun3()返回20
也就是说, 如果return的值相当于时final的,方法返回相当于指向一个内存区域并且内存地址不可改变, 如果是常量,则返回值不可改变, 如果是对象等变量, 那么可以在不该变对象地址的情况下,修改对象的属性
参考文章 return与finally到底谁先执行?.