java异常 字节码,Java字节码角度分析异常处理
目錄
從字節(jié)碼角度來分析:異常處理
1.1 異常-catch
// 從字節(jié)碼角度來分析:異常處理
public class T13_ByteAnalyseException {
public static void main(String[] args) {
int i = 0;
try {
i = 10;
} catch (Exception e) {
i = 20;
}
}
}
注意:為了抓住重點,下面的字節(jié)碼省略了不重要的部分
上述代碼通過:javap -v?T13_ByteAnalyseException.class進行反編譯,得到如下字節(jié)碼。
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=3, args_size=1
0: iconst_0
1: istore_1
2: bipush 10
4: istore_1
5: goto 12
8: astore_2 // 將異常對象引用存入局部變量表的 slot 2號位置
9: bipush 20
11: istore_1
12: return
Exception table: // 異常表,含頭不含尾;一旦2~4行代碼異常就進入異常判斷是否是聲明的Exception異常一致,如果一致就進入第8行
from to target type
2 5 8 Class java/lang/Exception
LineNumberTable:
line 15: 0
line 17: 2
line 20: 5
line 18: 8
line 19: 9
line 21: 12
LocalVariableTable:
Start Length Slot Name Signature
9 3 2 e Ljava/lang/Exception;
0 13 0 args [Ljava/lang/String;
2 11 1 i I
StackMapTable: ...
上述說明:
可以看到多出來一個Exception table的結(jié)構(gòu),[from, to)是前閉后開的檢測范圍,一旦這個范圍內(nèi)的字節(jié)碼執(zhí)行出現(xiàn)異常,則通過type匹配異常類型,如果一致,進入target所指示行號
8行的字節(jié)碼指令 astore_2 是將異常對象引用存入局部變量表的 slot 2號位置
1.2 異常-多個catch
先來看下異常-多個catch代碼示例:
// 從字節(jié)碼角度來分析:多個 single-catch 塊的情況
public class T14_ByteAnalyseMoreSingle_Catch {
public static void main(String[] args) {
int i = 0;
try {
i = 10;
} catch (ArithmeticException e) {
i = 30;
} catch (NullPointerException e) {
i = 40;
} catch (Exception e) {
i = 50;
}
}
}
上述代碼通過:javap -v?T14_ByteAnalyseMoreSingle_Catch.class進行反編譯,得到如下字節(jié)碼。
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=3, args_size=1
0: iconst_0
1: istore_1
2: bipush 10
4: istore_1
5: goto 26
8: astore_2
9: bipush 30
11: istore_1
12: goto 26
15: astore_2
16: bipush 40
18: istore_1
19: goto 26
22: astore_2
23: bipush 50
25: istore_1
26: return
Exception table:
from to target type
2 5 8 Class java/lang/ArithmeticException
2 5 15 Class java/lang/NullPointerException
2 5 22 Class java/lang/Exception
LineNumberTable: ...
LocalVariableTable: // 因為異常最終只會出現(xiàn)一種,這里采用了異常引用變量的槽位復(fù)用
Start Length Slot Name Signature
9 3 2 e Ljava/lang/ArithmeticException;
16 3 2 e Ljava/lang/NullPointerException;
23 3 2 e Ljava/lang/Exception;
0 27 0 args [Ljava/lang/String;
2 25 1 i I
StackMapTable: ...
上述說明:
因為異常出現(xiàn)時,只能進入 Exception table 中一個分支,所以局部變量表 slot 2 位置被共用。也算是一種優(yōu)化,為節(jié)省棧幀內(nèi)存的使用
1.3 異常-multicatch
先來看下異常-multi_catch代碼示例:
// 從字節(jié)碼角度來分析:multi-catch 的情況
// jdk1.7 新增multi catch
public class T15_ByteAnalyseMulti_Catch {
public static void main(String[] args) {
try {
Method test = T15_ByteAnalyseMulti_Catch.class.getMethod("test");
test.invoke(null);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
public static void test() {
System.out.println("ok");
}
}
上述代碼通過:javap -v?T15_ByteAnalyseMulti_Catch.class進行反編譯,得到如下字節(jié)碼。
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=2, args_size=1
0: ldc #2 // class com/jvm/t07_bytecode/T15_ByteAnalyseMulti_Catch
2: ldc #3 // String test
4: iconst_0
5: anewarray #4 // class java/lang/Class
8: invokevirtual #5 // Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
11: astore_1
12: aload_1
13: aconst_null
14: iconst_0
15: anewarray #6 // class java/lang/Object
18: invokevirtual #7 // Method java/lang/reflect/Method.invoke:(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
21: pop
22: goto 30
25: astore_1
26: aload_1
27: invokevirtual #11 // e.printStackTrace:()V
30: return
Exception table:
from to target type
0 22 25 Class java/lang/NoSuchMethodException
0 22 25 Class java/lang/IllegalAccessException
0 22 25 Class java/lang/reflect/InvocationTargetException
LineNumberTable: ...
LocalVariableTable:
Start Length Slot Name Signature
12 10 1 test Ljava/lang/reflect/Method;
26 4 1 e Ljava/lang/ReflectiveOperationException;
0 31 0 args [Ljava/lang/String;
上述說明:
異常-multi_catch ?字節(jié)碼?對比?異常-多個catch字節(jié)碼,并沒有特別的地方,只是異常表Exception table 三個異常的 target都一致。也有?異常-多個catch字節(jié)碼 異常對象引用在局部變量表中槽位復(fù)用。
文章最后,給大家推薦一些受歡迎的技術(shù)博客鏈接:
本文地址:https://blog.csdn.net/weixin_32265569/article/details/108024235
如您對本文有疑問或者有任何想說的,請點擊進行留言回復(fù),萬千網(wǎng)友為您解惑!
總結(jié)
以上是生活随笔為你收集整理的java异常 字节码,Java字节码角度分析异常处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平板电脑系统厂家推荐(平板电脑生产厂家排
- 下一篇: 固态硬盘tbw什么意思(硬盘健康度和TB