何时执行Java语言的finally块

来源:互联网 发布:java服务器开发 简历 编辑:程序博客网 时间:2024/06/06 03:51

最近看到一个非常有意思的代码:

public class TestException {  public static void main(String[] args) {    System.out.println(foo());  }  public static int foo() {    try {      int a = 10/0;      if (a > 0) return 4;    } catch(ArithmeticException e) {      return 45;    } finally {      return 34;    }  }}

问:程序的输出是什么?
分析:
程序会抛出ArithmeticException异常,因此会执行到catch块,所以返回45是有可能的,返回4可以排除了;
但是,但是,但是 好像也学到过finally是一定会在异常结束前执行,那么就应该是返回34了。

下面可以做两个简单的实验。
实验一:

public class TestException {  public static void main(String[] args) {    System.out.println(foo());  }  public static int foo() {    try {      int a = 10/0;      if (a > 0) return 4;    } catch(Exception e) {      System.out.println("execute catch block");      return 45;    } finally {      System.out.println("execute finally block");      return 34;    }  }}

输出结果:

execute catch blockexecute finally block34

实验二:

public class TestException {  public static void main(String[] args) {    System.out.println(foo());  }  public static int foo() {    try {      System.out.println("execute try block, before return");      return 4;    } catch(Exception e) {      System.out.println("execute catch block");      return 45;    } finally {      System.out.println("execute finally block");      return 34;    }  }}

输出结果:

execute try block, before returnexecute finally block34

结论

结果都是返回34,说明finally会在try和catch块结束之前执行,那结束之前又是在什么时候呢?
实验一说明了catch要先于finally块开始执行,但是在catch块执行return语句之前,会执行finally块;
实验二说明了当try的return语句之前时,会先执行finally块。
因此:finally会在try和catch return之前执行,如果try和catch块中没有return语句,那就是在两个块的大括号结束前执行。

原创粉丝点击