finally 和 return,到底谁先执行

简介: 经常有人面试被问到:finally 和 return,到底谁先执行呢?

为了解决这个问题,其实我们可以先想想 finally 是被用来干嘛的呢?它是被用来结束一些正常的收尾动作或结束标识。也就是说无论怎么样,finally 都会被最后执行。例如:一般在操作数据库时,用Jdbc连接池连接数据库后释放资源,需要 finally 来处理。再如 redis 连接,在获取连接池处理完数据的增删改查后,需要释放其连接池。

但是,如果 return 是在 finally 前面呢?或者在 finally 后面呢?我们先来看看 return 在 finally 前面时,如:

public class App {
  public static void main(String[] args) {
    System.out.println("return result: " + test());
  }

  public static int test() {
    try {
      Thread.sleep(1);
      System.out.println("執行 return 1");
      return 1;
    }
    catch (InterruptedException e) {
      e.printStackTrace();
      return -1;
    }
    finally {
      System.out.println("执行 finally");
    }
  }
}

在上面这个例子里,我们可以看到输出结果:

執行 return 1
执行 finally
return result: 1

也就是说,在执行 return 之前,先执行了 finally。

我们在看,如果 finally 前面有 return,在其内部也有 return:

public static int test() {
    try {
      Thread.sleep(1);
      System.out.println("執行 return 1");
      return 1;
    }
    catch (InterruptedException e) {
      e.printStackTrace();
      return -1;
    }
    finally {
      System.out.println("执行 finally");
      return 3;
    }
}

结果为:

執行 return 1
执行 finally
return result: 3

return 在try{} 里,则先执行,再执行finally后才有可能执行该return,其内部被 return 后,就不再执行前面那个 return 了。

我们再来看 return 在 finally 之后,如:

public static int test() {
    try {
      Thread.sleep(1);
    }
    catch (InterruptedException e) {
      e.printStackTrace();
    }
    finally {
      System.out.println("执行 finally");
    }
    System.out.println("執行 return 2");
    return 1;
}

输出结果:

执行 finally
執行 return 2
return result: 1

总结:finally 在 return 之后时,先执行 finally 后,再执行该 return;finally 内含有 return 时,直接执行其 return 后结束;finally 在 return 前,执行完 finally 后再执行 return。

接下来还有常被问到的是:Java 中 final、finally、finalize 的区别与用法:

  • final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。即如果一个类被声明为 final,意味着它不能作为父类被继承,因此一个类不能同时被声明为 abstract 的,又被声明为 final 的。变量或方法被声明为 final,可以保证它们在使用中不被修改。被声明为 final 的变量必须在声明时给赋予初值,而在以后的引用中只能读取,不可修改。被声明为 final 的方法也同样只能使用,不能重载。
  • finally 是异常处理语句结构的一部分,总是执行,常见的场景:释放一些资源,例如前面所说的 redis、db 等。在异常处理时提供 finally 块来执行任何清除操作,即在执行 catch 后会执行 finally 代码块。
  • finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
相关文章
每日一道面试题之try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
每日一道面试题之try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
163 0
try catch finally,try 里面有 return,finally 还执行吗?
try catch finally,try 里面有 return,finally 还执行吗?
67 0
|
6月前
|
设计模式 消息中间件 前端开发
finally中的代码一定会执行吗?
finally中的代码一定会执行吗?
512 0
try...catch中,catch加了return,后面的代码是不会执行的
try...catch中,catch加了return,后面的代码是不会执行的
104 0
try catch return语句情况分析
简要讲述一下try catch代码中return语句返回值情况分析
|
Java
【学习笔记】【Java】try-catch-finally中,finally是在什么时候执行的:try结束、catch结束、return前
结论:try-catch-finally中,finally执行:try结束、catch结束、return前
192 0
【学习笔记】【Java】try-catch-finally中,finally是在什么时候执行的:try结束、catch结束、return前
try-catch-finally结构的finally语句 一定会执行吗? fianlly语句遇到System.exit(0);一定不执行吗?
try-catch-finally结构的finally语句 一定会执行吗? fianlly语句遇到System.exit(0);一定不执行吗?
173 0
try-catch-finally结构的finally语句 一定会执行吗? fianlly语句遇到System.exit(0);一定不执行吗?
try-catch-finally 和 return 是怎么执行的?
来源:http://liangfei.me/ 最近一直在看Java虚拟机规范,发现直接分析bytecode更能加深对Java语言的理解。 之前看过一篇关于 return 和 finally 执行顺序的文章,仅在 Java 的语言层面做了分析,其实我倒觉得直接看 bytecode 可能来的更清晰一点。
try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会。 前。 准确的说,应该是在中间。(注意参考系) 示例代码如下: 1 package cn.itcast_07; 2 3 /* 4 * 面试题: 5 * 1:final,finally和finalize的区别 6 * final:最终的意思,可以修饰类、成员变量、成员方法 7 * 修饰类,类不能被继承。
1719 0