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"