经常有人面试被问到,finally 和 return,到底谁先执行呢?
为了解决这个问题,其实我们可以先想想 finally 是被用来干嘛的呢?它是被用来结束一些正常的收尾动作或结束标识。也就是说无论怎么样,finally 都会被最后执行。例如:一般在操作数据库时,用Jdbc连接池连接数据库后释放资源,需要 finally 来处理。再如 redis 连接,在获取连接池处理完数据的增删改查后,需要释放其连接池。
但是,如果 return 是在 finally 前面呢?或者在 finally 后面呢?我们先来看看 return 在 finally 前面时,如:
package com.test; /** * * * @author Damon * @date 2020年3月18日 上午11:02:08 * */ 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;// return 在try里,則先執行,再執行finally后才有可能执行该return } catch (InterruptedException e) { e.printStackTrace(); return -1; } finally { System.out.println("执行 finally"); //return 3; } //System.out.println("執行 return 2"); //return 1; } } 结果: 執行 return 1 执行 finally return result: 1 复制代码
也就是说,在执行 return 之前,先执行了 finally。
我们在看,如果 finally 前面有 return,在其内部也有 return:
package com.test; /** * * * @author Damon * @date 2020年3月18日 上午11:02:08 * */ 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;// return 在try里,則先執行,再執行finally后才有可能执行该return } catch (InterruptedException e) { e.printStackTrace(); return -1; } finally { System.out.println("执行 finally"); return 3; } //System.out.println("執行 return 2"); //return 1; } } 结果: 執行 return 1 执行 finally return result: 3 复制代码
其内部被 return 后,就不再执行前面那个 return 了。
我们再来看 return 在 finally 之后,如:
package com.test; /** * * * @author Damon * @date 2020年3月18日 上午11:02:08 * */ 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;// return 在try里,則先執行,再執行finally后才有可能执行该return } catch (InterruptedException e) { e.printStackTrace(); //return -1; } finally { System.out.println("执行 finally"); //return 3; } 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 的区别与用法:
结束福利
开源实战利用 k8s 作微服务的架构设计代码:
https://gitee.com/damon_one/spring-cloud-k8s 复制代码
欢迎大家 star,多多指教。
关于作者
笔名:Damon,技术爱好者,长期从事 Java 开发、Spring Cloud 的微服务架构设计,以及结合docker、k8s做微服务容器化,自动化部署等一站式项目部署、落地。Go 语言学习,k8s研究,边缘计算框架 KubeEdge 等。公众号 程序猿Damon
发起人。个人微信 MrNull008
,欢迎來撩。
欢迎关注 InfoQ: https://www.infoq.cn/profile/1905020/following/user