明眼人看到标题就知道我想说什么,本篇旨在帮助自己记忆,同时让更多人了解其中原理,原文在此。
言归正传,如果try块中存在return语句,那么finally块会执行么? 在return前面执行还是后面? 那如果finally块也存在return呢?直接上代码
//第一种情况:try中有return,finally里没有return
public class Child {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new Child().t());
}
public int t() {
int i = 0;
try {
i = 1;
return i += 9;
} catch (Exception e) {
} finally {
// return 10;
if (10 == i) {
i = 50;
System.out.println("i = "+i+" in finally");
}
}
return i += 10;
}
}
结果如下
i = 50 in finally
10
从上面结果,我们可以认识到这几个问题。
- finally在try块中return的后面执行。
- 虽然try块里面的return返回的是(i + 9)的值,但是即使finally对i值进行了改变,但仍然不会改变return的值,就好像是try块里把return的值(而不是i)放到一个池中,即使finally里对i值做了改变,结果仍然不会改变池中的值。
//第二种情况:try、finally里都有return
public class Child {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new Child().t());
}
public int t() {
int i = 0;
try {
i = 1;
return i += 9;
} catch (Exception e) {
} finally {
// return 10;
if (10 == i) {
i = 50;
System.out.println("i = "+i+" in finally");
}
return i;
}
}
}
运行结果
i = 50 in finally
50
从上面结果,我们可以认识到这几个问题。
- 当try和finally里都有return的时候,finally里return的值会把之前池中的值覆盖掉。