先阅读以下代码,查看结果:
public class TryAndCatch {
public static void main(String[] args) {
int i = test01();
System.out.println("最终结果:"+i);
}
public static int test01() {
int i=0;
try{
System.out.println("=====执行Try块========");
++i;
return i;
}catch(Exception e){
System.out.println("=====执行Catch块======");
++i;
return i ;
}finally {
System.out.println("===执行Finally块======");
}
}
}
结果:
try块中即使有return语句,finally也会照样进行,
finally块要执行,则必须满足在return语句前执行。
理解:
当执行到try中return语句时,会先将变量存储到一个临时的栈空间中,
然后去执行finally中的语句,
执行完成后,在把临时存储的值取出来返回。
小结 :
finally块在Java的捕获机制中是不管出现什么情况,一定会被执行。
所以在执行try 、catch中的return之前一定会执行finally中的语句。
正常情况下会在try块中执行完成后走Finally块,只有在try块中出现错误才会进入catch块中
进阶版:
若Fianlly中有修改 i 值
修改上述fianlly代码:
finally {
System.out.println("===执行Finally块前======");
++i;
System.out.println("===执行Finally块后======");
}
结果:
不是我们预设的2,
分析:
上面讲到将变量存储到一个临时的栈空间中是return语句的功能,
执行try中的return i 时,将 i = 1 存储到栈空间中;
接着执行finally块,此时的 i 的值为2,但并没有作任何的返回处理,所以并未更新临时的栈空间
finally块执行完后,返回未更新的栈空间所存储的 i 的值,即返回 1。
紧接着 :
若Fianlly中修改 i 值,并且有return
修改代码:
finally {
System.out.println("===执行Finally块前======");
++i;
System.out.println("===执行Finally块后======");
return i;
}
结果:
解释:
由于finally块中的return语句,
执行到return时,更新了栈空间中 i 的值,返回结果为更新后的值,即为 2