try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?
答案用例子验证:
public class StackOverflowTest {
public static void main(String[] args) {
String aString = getFun();
System.out.println(aString);
}
private static String getFun() {
String aString = "try";
try {
System.out.println(aString);
return aString;
} catch (Exception e) {
// TODO: handle exception
} finally {
aString = "finally";
System.out.println("finally");
return aString;
}
}
}
运行结果:
try
finally
finally
说明:finally会执行,而且在try的return前
但是这个例子发现一个问题,finally改变了函数的返回值
注意:
在finally中改变返回值的做法是不好的,因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值。
显然,在finally中返回或者修改返回值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种龌龊的事情,Java中也可以通过提升编译器的语法检查级别来产生警告或错误,Eclipse中可以在如图所示的地方进行设置,强烈建议将此项设置为编译错误。
如果是warning