问题出现
下面请读者做好准备,我将给出一段代码,让你道出最终结果。
public class ReturnToIPlusPlus {
public static void main(String[] args) {
System.out.println(test());
}
public static int test(){
int i=0;
try{
return i++;
}finally{
return ++i;
}
}
}
对于这段代码,如果要想知道结果,我们首先要知道的就是最终会走哪儿一个return。这才是关键。
现在公布正确答案,最终答案输出为:
2
如果要知道为什么是这个答案,你首先要知道:
- i++的计算过程是怎么样的。参考i++的执行过程
- 到底最终由哪儿一个return进行返回。
分析执行过程:
第一步:我们定义了一个i初始化值为0。
第二步:进入try中,执行i++表达式。执行完成后i变成了1,return 该返回的值为0。但是在try中执行的return有点特殊,它不会第一时间就进行返回值,而是会先进行一个判断,判断是否还有finally,如果有就执行finally,如果没有就返回值。很明显,我们这里会执行finally。
第三步:执行finally。在这里再次执行一个表达式,++i,当++i执行完毕后,i的值变成了2,该返回的值也是2。执行finally中的return返回值。
第四步:最终我们看到的结果是2。
总结:
- 如果try中和finally中都有return,会最终执行finally中的return。(该try中的return返回最终结果(最终结果的意思是,如果return返回的是表达式就要先执行表达式,如果是值就直接返回)时会先暂停,判断是否有finally还要执行。)
明白了上面的代码,接下来这个代码就是很easy的了:
public class ReturnToIPlusPlus {
public static void main(String[] args) {
System.out.println(test());
}
public static int test(){
int i=0;
try{
return i++;
}finally{
++i;
}
}
}
输出结果为:
0
原因我在上面已经解释得很清楚了:
进入try中,执行i++表达式。执行完成后i变成了1,return 该返回的值为0。但是在try中执行的return有点特殊,它不会第一时间就进行返回值,而是会先进行一个判断,判断是否还有finally,如果有就执行finally,如果没有就返回值。很明显,我们这里会执行finally。
但是在finally中我们只是对i++进行了自增。try中的return 还是得返回0。这也就是输出0的原因。
如果你不能理解上面这段话,请仔细阅读这篇博客:参考i++的执行过程