参考答案
对这种情况,JVM规范有特殊规定:
- try中有return, 会先将值暂存,无论finally语句中对该值做什么处理,最终返回的都是try语句中的暂存值。
- 当try与finally语句中均有return语句,会忽略try中return。
实例:
当程序执行try{}遇到return时,程序会先执行return语句,但不会立即返回。
即将return语句要做的一切事情都准备好,在将要返回、但并未返回的时候,程序把执行流程转去执行finally块,当finally块执行完成之后,直接返回刚才return语句已经准备好的结果。
public class Test{ publicstatic void main(String[] args) { System.out.println(new Test().test());; } staticint test(){ int x = 1; try { returnx++; } finally { System.out.println("finally块执行:" + ++x); returnx; } } }
结果:
finally块执行:2
上面程序中finally块已经执行,而且程序执行finally块时,已经把x变量增加到2。
但是,test()方法返回的依然是1,这是由return语句执行流程决定的。
Java会把return语句先执行完、把所有需要处理的东西都先处理完成。需要返回的值也都准备好之后,在还未返回之前,程序流程会转去执行finally块,但是,此时finally块中的对x变量的修改已经不会影响return要返回的值了。
如果finally块里也包含return语句,则另当别论, 因为finally块里的return语句也会导致方法返回。
我们把程序改为如下形式:
public class Test{ publicstatic void main(String[] args) { System.out.println(new Test().test());; } staticint test(){ int x = 1; try { returnx++; } finally { System.out.println("finally块执行:" + ++x); returnx; } } }
结果:
finally块执行:3
程序在执行returnx++;时,程序会把return语句执行完成,只是等待返回,此时x的值已经是2,但程序此处准备的返回值依然是1。
接下来,程序流程转去执行finally块,此时程序会再次对x自加,于是x变成了3,由于finally块中也有return x;语句,程序将会直接由这条语句返回。
因此,上面test()方法将会返回3。
以上,是Java面试题【try里面return, finally还会执行吗】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—