try里面return, finally还会执行吗

参考答案

对这种情况,JVM规范有特殊规定:

  1. try中有return, 会先将值暂存,无论finally语句中对该值做什么处理,最终返回的都是try语句中的暂存值。
  2. 当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—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧