jvm: 异常处理在字节码层面是通过Exception Table实现异常出现时的跳转的

ExceptionTable是Code属性的一个属性
ExceptionTable里定义了异常处理的匹配逻辑.Exception table定义了字节码的开始行号、结束行号、处理逻辑的行号、异常类型。
当定义finally块时,在每个catch字节码后都会跟着finally块对应的字节码

package cn.edu.tju.controller;

import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;

public class ExceptionTest {
    public static void main(String[] args) {
        try {
            Class<?> clazz =ClassLoader.getSystemClassLoader().loadClass("Test");
            ServerSocket serverSocket = new ServerSocket(9999);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception ex){
            ex.printStackTrace();
        }

    }
}

Classfile /D:/springcloudskywalking/module1/target/classes/cn/edu/tju/controller/ExceptionTest.class
  Last modified 2023-4-1; size 1142 bytes
  MD5 checksum 9c23a32618abf437207fbbc426617a37
  Compiled from "ExceptionTest.java"
public class cn.edu.tju.controller.ExceptionTest
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #14.#41        // java/lang/Object."<init>":()V
   #2 = Methodref          #42.#43        // java/lang/ClassLoader.getSystemClassLoader:()Ljava/lang/ClassLoader;
   #3 = String             #44            // Test
   #4 = Methodref          #42.#45        // java/lang/ClassLoader.loadClass:(Ljava/lang/String;)Ljava/lang/Class;
   #5 = Class              #46            // java/net/ServerSocket
   #6 = Methodref          #5.#47         // java/net/ServerSocket."<init>":(I)V
   #7 = Class              #48            // java/lang/ClassNotFoundException
   #8 = Methodref          #7.#49         // java/lang/ClassNotFoundException.printStackTrace:()V
   #9 = Class              #50            // java/io/IOException
  #10 = Methodref          #9.#49         // java/io/IOException.printStackTrace:()V
  #11 = Class              #51            // java/lang/Exception
  #12 = Methodref          #11.#49        // java/lang/Exception.printStackTrace:()V
  #13 = Class              #52            // cn/edu/tju/controller/ExceptionTest
  #14 = Class              #53            // java/lang/Object
  #15 = Utf8               <init>
  #16 = Utf8               ()V
  #17 = Utf8               Code
  #18 = Utf8               LineNumberTable
  #19 = Utf8               LocalVariableTable
  #20 = Utf8               this
  #21 = Utf8               Lcn/edu/tju/controller/ExceptionTest;
  #22 = Utf8               main
  #23 = Utf8               ([Ljava/lang/String;)V
  #24 = Utf8               clazz
  #25 = Utf8               Ljava/lang/Class;
  #26 = Utf8               e
  #27 = Utf8               Ljava/lang/ClassNotFoundException;
  #28 = Utf8               Ljava/io/IOException;
  #29 = Utf8               ex
  #30 = Utf8               Ljava/lang/Exception;
  #31 = Utf8               args
  #32 = Utf8               [Ljava/lang/String;
  #33 = Utf8               LocalVariableTypeTable
  #34 = Utf8               Ljava/lang/Class<*>;
  #35 = Utf8               StackMapTable
  #36 = Class              #48            // java/lang/ClassNotFoundException
  #37 = Class              #50            // java/io/IOException
  #38 = Class              #51            // java/lang/Exception
  #39 = Utf8               SourceFile
  #40 = Utf8               ExceptionTest.java
  #41 = NameAndType        #15:#16        // "<init>":()V
  #42 = Class              #54            // java/lang/ClassLoader
  #43 = NameAndType        #55:#56        // getSystemClassLoader:()Ljava/lang/ClassLoader;
  #44 = Utf8               Test
  #45 = NameAndType        #57:#58        // loadClass:(Ljava/lang/String;)Ljava/lang/Class;
  #46 = Utf8               java/net/ServerSocket
  #47 = NameAndType        #15:#59        // "<init>":(I)V
  #48 = Utf8               java/lang/ClassNotFoundException
  #49 = NameAndType        #60:#16        // printStackTrace:()V
  #50 = Utf8               java/io/IOException
  #51 = Utf8               java/lang/Exception
  #52 = Utf8               cn/edu/tju/controller/ExceptionTest
  #53 = Utf8               java/lang/Object
  #54 = Utf8               java/lang/ClassLoader
  #55 = Utf8               getSystemClassLoader
  #56 = Utf8               ()Ljava/lang/ClassLoader;
  #57 = Utf8               loadClass
  #58 = Utf8               (Ljava/lang/String;)Ljava/lang/Class;
  #59 = Utf8               (I)V
  #60 = Utf8               printStackTrace

{
  public cn.edu.tju.controller.ExceptionTest();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 7: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcn/edu/tju/controller/ExceptionTest;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=3, args_size=1
         0: invokestatic  #2                  // Method java/lang/ClassLoader.getSystemClassLoader:()Ljava/lang/ClassLoader;
         3: ldc           #3                  // String Test
         5: invokevirtual #4                  // Method java/lang/ClassLoader.loadClass:(Ljava/lang/String;)Ljava/lang/Class;
         8: astore_1
         9: new           #5                  // class java/net/ServerSocket
        12: dup
        13: sipush        9999
        16: invokespecial #6                  // Method java/net/ServerSocket."<init>":(I)V
        19: astore_2
        20: goto          44
        23: astore_1
        24: aload_1
        25: invokevirtual #8                  // Method java/lang/ClassNotFoundException.printStackTrace:()V
        28: goto          44
        31: astore_1
        32: aload_1
        33: invokevirtual #10                 // Method java/io/IOException.printStackTrace:()V
        36: goto          44
        39: astore_1
        40: aload_1
        41: invokevirtual #12                 // Method java/lang/Exception.printStackTrace:()V
        44: return
      Exception table:
         from    to  target type
             0    20    23   Class java/lang/ClassNotFoundException
             0    20    31   Class java/io/IOException
             0    20    39   Class java/lang/Exception
      LineNumberTable:
        line 10: 0
        line 11: 9
        line 18: 20
        line 12: 23
        line 13: 24
        line 18: 28
        line 14: 31
        line 15: 32
        line 18: 36
        line 16: 39
        line 17: 40
        line 20: 44
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            9      11     1 clazz   Ljava/lang/Class;
           24       4     1     e   Ljava/lang/ClassNotFoundException;
           32       4     1     e   Ljava/io/IOException;
           40       4     1    ex   Ljava/lang/Exception;
            0      45     0  args   [Ljava/lang/String;
      LocalVariableTypeTable:
        Start  Length  Slot  Name   Signature
            9      11     1 clazz   Ljava/lang/Class<*>;
      StackMapTable: number_of_entries = 4
        frame_type = 87 /* same_locals_1_stack_item */
          stack = [ class java/lang/ClassNotFoundException ]
        frame_type = 71 /* same_locals_1_stack_item */
          stack = [ class java/io/IOException ]
        frame_type = 71 /* same_locals_1_stack_item */
          stack = [ class java/lang/Exception ]
        frame_type = 4 /* same */
}
SourceFile: "ExceptionTest.java"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值