Java异常机制之try catch finally return执行顺序

Java异常机制之try catch finally return执行顺序

  • Backdround
    • 什么时候不执行finally
    • final执行的终极原则
      • 没有异常finally也要跑
      • return或throw前finally执行
    • 返回值与finally的不解之谜
      • finally里没有return时
      • finally里有return时

Backdround

实验室的大师姐突然问窝很详细的Java异常代码块的执行顺序,一下子被问蒙了,写了个测试代码,顺手放上来充数(其实不是,就是不想写托福,不学习怎么都快乐)

什么时候不执行finally

  1. try 或catch语句中执行了退出虚拟机的方法(即System.exit(0))
  2. 执行finally之前jvm崩了
  3. 执行finally之前电脑崩了

final执行的终极原则

没有异常finally也要跑

你懂的,不管有没有异常,final这位小火鸡都会运行

code:懒得写

return或throw前finally执行

try或catch的代码块里时遇到return或throw语句时,finally仍然会执行,反而系统并不会立即执行return或throw这两个语句,而是会去执行final,如果没有finally块,程序才会立即执行return语句或者throw语句,方法终止。如果有 finally块,系统立即开始执行finally块,只有当finally块执行完成后,系统才会再次跳回来执行try块、catch块里的 return或throw语句,如果finally块里也使用了return或throw等导致方法终止的语句,则finally块已经终止了方法,不用再跳回去执行try块、catch块里的任何代码。

当finally块里也使用了return语句,弱智代码如下:

public class Main {
    public static void main(String[] args) {
        System.out.println("normal operation in main function");
        System.out.println(testException());
    }

    private static String testException(){
        try {
            System.out.println("normal operation in try block");
            return "TRY";
        }finally {
            System.out.println("normal operation in final block");
            return "finally";
        }
    }
}

运行结果:
Java异常机制之try catch finally return执行顺序_第1张图片

当finally块里没有return语句:
Java异常机制之try catch finally return执行顺序_第2张图片

返回值与finally的不解之谜

finally里没有return时

finally里没有return时,函数返回值是在finally执行前确定的,你猜猜下面这段代码结果是啥

public class Main {
    public static void main(String[] args) {
        System.out.println("normal operation in main function");
        System.out.println(testException());
    }

    private static String testException(){
        String retStr;
        try {
            retStr = "TRY";
            System.out.println("normal operation in try block");
            return retStr;
        }finally {
            retStr = "finally";
            System.out.println("normal operation in final block");
        }
    }
}

运行结果可能会出乎你的意料
Java异常机制之try catch finally return执行顺序_第3张图片
不要慌,程序没问题,此处涉及到一些jvm机制,详情咱有空再说,可以参考这个博客:Java进阶–Java中 i++完全解析

finally里有return时

finally里有return时,程序会提前退出,而且返回值不是try或catch中保存的返回值,而是finally里面的return语句,其实应该就是return这句其实并不是我们臆想中的简单顺序执行代码,详情可以查看对应代码的字节码
Java异常机制之try catch finally return执行顺序_第4张图片

你可能感兴趣的:(软件工程小菜鸡)