记录学习--字节码解析try catch

1.示例代码

	@Test
    public void someTest() {
        String s = "111";
        try {
            s = "222";
            int i = 1/0;
        } catch (Exception e){
            e.printStackTrace();
            System.out.println(s);
        }
        System.out.println(s);
    }

2.示例代码对应的字节码

 0 ldc #2 <111>
 2 astore_1
 3 ldc #3 <222>
 5 astore_1
 6 iconst_1
 7 iconst_0
 8 idiv
 9 istore_2
10 goto 25 (+15)
13 astore_2
14 aload_2
15 invokevirtual #5 <java/lang/Exception.printStackTrace : ()V>
18 getstatic #6 <java/lang/System.out : Ljava/io/PrintStream;>
21 aload_1
22 invokevirtual #7 <java/io/PrintStream.println : (Ljava/lang/String;)V>
25 getstatic #6 <java/lang/System.out : Ljava/io/PrintStream;>
28 aload_1
29 invokevirtual #7 <java/io/PrintStream.println : (Ljava/lang/String;)V>
32 return

记录学习--字节码解析try catch_第1张图片

3.说明

代码一般看得懂,从字节码说明,字节码和代码一起看,看的更清晰。
①0、2声明变量s。
②3到10是try部分代码,如果这段代码之间有Exception的异常,就从发生异常的位置跳到13。注意:跳之前的代码也是执行了的。
③如果没发生异常,在10的位置就直接跳到25,并继续执行后面的字节码。
④如果发生了异常,就跳到13,并继续执行13后面的字节码。

4.执行结果

异常打印的栈内容省略了。

java.lang.ArithmeticException: / by zero
222
222

你可能感兴趣的:(springboot,java)