日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java异常 字节码,Java字节码角度分析异常处理

發(fā)布時間:2023/12/3 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java异常 字节码,Java字节码角度分析异常处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

從字節(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。