从字节码看try catch finally的return如何执行

1、finally语句不会被执行的状况,至少有以下两种java

  1. try语句没有执行到,如在try语句以前就返回了,就这样finally语句就不会执行,说明finally语句被执行的前提是相应的try语句被执行到。
  2. 在try块中有System.exit(0)(是终止java虚拟机JVM的);语句,连JVM都中止了,全部都结束了,finally也不会被执行到。

2、return语句的关系bash

  1. finally语句在return语句执行以后return返回以前执行

public class FinallyReturnTest {    public static void main(String[] args) {        System.out.println(test());    }    public static String test() {        try {            System.out.println("try block");            return getResult();        } finally {            System.out.println("finally block");        }    }    public static String getResult() {        System.out.println("get result");        return "result";    }}复制代码

返回结果app

try block
get result
finally block
result

Process finished with exit code 0复制代码

2.try中的返回值可能由于finally里的修改也可能不变ui

test1:spa

复制代码

public class FinallyReturnTest1 {    public static void main(String[] args) {        System.out.println(test());    }    public static int test() {        int b = 20;        try {            System.out.println("try block");            return b += 80;        } catch (Exception e) {            System.out.println("catch block");        } finally {            System.out.println("finally block");            if (b > 25) {                System.out.println("b>25, b = " + b);            }            b = 150;        }        return 2000;    }}复制代码

返回结果
code

try block
finally block
b>25, b = 100
100复制代码

test2:ip

复制代码

public class FinallyReturnTest2 {    public static void main(String[] args) {        System.out.println(getMap().get("KEY"));    }    public static Map<String, String> getMap() {        Map<String, String> map = new HashMap<>();        map.put("KEY", "INIT");        try {            map.put("KEY", "TRY");            return map;        }        catch (Exception e) {            map.put("KEY", "CATCH");        }        finally {            map.put("KEY", "FINALLY");            map = null;        }        return map;    }}
复制代码

返回结果
get

FINALLY

Process finished with exit code 0复制代码

三、try块里的return语句在异常的状况下不会被执行,这样具体返回哪一个看状况虚拟机

①catch和finally块里无返回语句,返回finally外的return语句。string

②若是catch块里无返回语句,finally里有返回语句,返回finally的return语句。

③若是catch块里有return语句,执行的状况和try同样,finally有返回语句,执行finally中的返回语句。

3、字节码角度理解

 public int get();

descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=4, args_size=1
         0: iconst_0 将int型0推送至栈顶(操做数栈)         1: istore_1 将栈顶int型数值存入第二个本地变量(局部变量表)         2: iconst_2 将int型2推送至栈顶         3: ireturn 从当前方法返回int,返回finally中的return值 2         4: astore_1 将栈顶引用型数值存入第二个变量(出现异常,将Exception存入局部变量表)         5: aload_1 将第二个引用型本地变量推送至栈顶         6: invokevirtual #3// Method java/lang/Exception.printStackTrace:()V 调用Exception实例方法 9: iconst_1 将int型1推送至栈顶 10: istore_2 将栈顶int型数值存入第三个本地变量 11: iconst_2 将int型2推送至栈顶 12: ireturn 从当前方法返回int,返回finally中的return值 13: astore_3 将栈顶引用型数值存入第四个变量 14: iconst_2 将int型2推送至栈顶 15: ireturn 从当前方法返回int,返回finally中的return值 2 Exception table: from to target type 0 2 4 Class java/lang/Exception 0 2 13 any 4 11 13 any LineNumberTable: line 7: 0 line 12: 2 line 8: 4 line 9: 5 line 10: 9 line 12: 11

复制代码
相关文章
相关标签/搜索