北大青鸟光谷校区

北大青鸟光谷校区

  • 北大青鸟徐东校区
  • 北大青鸟光谷校区
  • 北大青鸟高新校区
  • 荆州青鸟之家
  • 襄阳青鸟之家

17740513250

百日千才

源码详解try_catch_finnaly语句执行

发布日期:2023-03-31来源:武汉北大青鸟武汉校区作者:027hpit

  面试过的同学应该有一道题的记忆,因为大多java程序员面试场合都会发生这样的事件。

  试题如下:

  try {}里有一个return 语句,那么紧跟在这个try 后的

  finally {}里的code 会不会被执行,什么时候被执行,在return

  前还是后?

  ……

  ……

  希望不要早早看下面的解释,自己想一下

  ……

  ……

  也许你的答案是在return 之前,但往更细地说,是在return 中间执行

  看源码:

  package dec;

  /**

  *

  *

  *

  * Title: try_catch_finally测试代码 /p>

  *

  *

  * Description: 示例 业务类

  *

  *

  *

  * Copyright: Copyright (c) 2012

  *

  *

  *

  * @author dml@2012-12-4

  * @version 1.0

  */

  public class TestTryCatchFinaly {

  public static void main(String[] args) {

  System.out.println("test1返回结果:" + new TestTryCatchFinaly()。test1());

  }

  int test1() {

  int x = 1;

  try {

  System.out.println("try打印:" + x);

  return x;

  //这句编译不通过

  // System.out.println("try打印:" + x);

  } finally {

  ++x;

  System.out.println("finally打印:" + x);

  }

  }

  }

  以上程序运行结果:

  try打印:1

  finally打印:2

  test1返回结果:1//运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

  明白了吧,先执行try中语句,然后遇到return时,将结果返回,接着执行finally中语句,后执行主函数语句。

  接下来,看看这个函数:

  public int test2() {

  try {

  return 1;

  } finally {

  return 2;

  }

  }

  主函数中:

  System.out.println("test2返回结果:" + new TestTryCatchFinaly()。test2());

  应该打印结果是?

  ……

  ……

  好好想想

  ……

  ……

  执行结果是:

  test2返回结果:2

  是不是有点晕了?不怕…

  看看解释怎么说的:

  try 中的return 语句调用的函数先于finally 中调用的函数执行,也就是说return 语句先执行,

  finally 语句后执行,所以,返回的结果是2.Return 并不是让函数马上返回,而是return 语

  句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally 语

  句后才真正开始返回。

  这会儿应该懂了吧,测试一下:

  int test3() {

  try {

  return func1();

  }

  finally {

  return func2();

  }

  }

  int func1() {

  System.out.println("func1被执行");

  return 1;

  }

  int func2() {

  System.out.println("func2被执行");

  return 2;

  }

  主函数中:

  System.out.println("test3返回结果:"+new TestTryCatchFinaly()。test3());

  执行结果是?

  ……

  ……

  func1被执行

  func2被执行

  test3返回结果:2

  要是还不明白,看看上面的一句话

  明白了吧,先执行try中语句,然后遇到return时,将结果返回,接着执行finally中语句,后执行主函数语句。

  好好理解下

  ……

  ……

  针对后面两个示例,可以这么总结:

  明白了吧,先执行try中语句,然后遇到return时,将结果返回,接着执行finally中语句,遇到return,将结果返回(也就是后打印的结果),后执行主函数语句。

  p.s.程序的好处是无论什么时候都是确定的,不确定的只有程序员是否真的掌握了,不要把技术看的太难,也不能把技术看的太简单,做对的事情要比把事情对更重要。

关闭

只为了方便您就学 北大青鸟光谷校区 北大青鸟武汉校区

武汉市洪山区珞喻路724号(地铁二号线光谷广场站F口出

Copyright (c) 2006-2023 武汉宏鹏教育咨询有限公司 版权所有 All Rights Reserved.