首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Java字节码角度分析异常处理——提升硬实力9

  • 25-03-07 20:01
  • 4146
  • 8920
blog.csdn.net

在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下。

1.Java字节码的一段旅行经历——提升硬实力1

2.Java字节码角度分析a++ ——提升硬实力2

3.Java字节码角度分析条件判断指令 ——提升硬实力3

4.Java字节码角度分析循环控制 ——提升硬实力4

5.Java字节码角度分析判断结果 ——提升硬实力5

6.Java字节码角度分析构造方法 ——提升硬实力6

7.Java字节码角度分析方法调用 ——提升硬实力7

8.Java字节码角度分析多态原理 ——提升硬实力8


目录

从字节码角度来分析:异常处理

1.1 异常-catch

1.2 异常-多个catch

1.3 异常-multicatch


从字节码角度来分析:异常处理

1.1 异常-catch

  1. // 从字节码角度来分析:异常处理
  2. public class T13_ByteAnalyseException {
  3. public static void main(String[] args) {
  4. int i = 0;
  5. try {
  6. i = 10;
  7. } catch (Exception e) {
  8. i = 20;
  9. }
  10. }
  11. }

注意:为了抓住重点,下面的字节码省略了不重要的部分

上述代码通过:javap -v T13_ByteAnalyseException.class进行反编译,得到如下字节码。

  1. public static void main(java.lang.String[]);
  2. descriptor: ([Ljava/lang/String;)V
  3. flags: ACC_PUBLIC, ACC_STATIC
  4. Code:
  5. stack=1, locals=3, args_size=1
  6. 0: iconst_0
  7. 1: istore_1
  8. 2: bipush 10
  9. 4: istore_1
  10. 5: goto 12
  11. 8: astore_2 // 将异常对象引用存入局部变量表的 slot 2号位置
  12. 9: bipush 20
  13. 11: istore_1
  14. 12: return
  15. Exception table: // 异常表,含头不含尾;一旦2~4行代码异常就进入异常判断是否是声明的Exception异常一致,如果一致就进入第8行
  16. from to target type
  17. 2 5 8 Class java/lang/Exception
  18. LineNumberTable:
  19. line 15: 0
  20. line 17: 2
  21. line 20: 5
  22. line 18: 8
  23. line 19: 9
  24. line 21: 12
  25. LocalVariableTable:
  26. Start Length Slot Name Signature
  27. 9 3 2 e Ljava/lang/Exception;
  28. 0 13 0 args [Ljava/lang/String;
  29. 2 11 1 i I
  30. StackMapTable: ...

上述说明: 

  1. 可以看到多出来一个Exception table的结构,[from, to)是前闭后开的检测范围,一旦这个范围内的字节码执行出现异常,则通过type匹配异常类型,如果一致,进入target所指示行号
  2. 8行的字节码指令 astore_2 是将异常对象引用存入局部变量表的 slot 2号位置

1.2 异常-多个catch

先来看下异常-多个catch代码示例:

  1. // 从字节码角度来分析:多个 single-catch 块的情况
  2. public class T14_ByteAnalyseMoreSingle_Catch {
  3. public static void main(String[] args) {
  4. int i = 0;
  5. try {
  6. i = 10;
  7. } catch (ArithmeticException e) {
  8. i = 30;
  9. } catch (NullPointerException e) {
  10. i = 40;
  11. } catch (Exception e) {
  12. i = 50;
  13. }
  14. }
  15. }

上述代码通过:javap -v T14_ByteAnalyseMoreSingle_Catch.class进行反编译,得到如下字节码。

  1. public static void main(java.lang.String[]);
  2. descriptor: ([Ljava/lang/String;)V
  3. flags: ACC_PUBLIC, ACC_STATIC
  4. Code:
  5. stack=1, locals=3, args_size=1
  6. 0: iconst_0
  7. 1: istore_1
  8. 2: bipush 10
  9. 4: istore_1
  10. 5: goto 26
  11. 8: astore_2
  12. 9: bipush 30
  13. 11: istore_1
  14. 12: goto 26
  15. 15: astore_2
  16. 16: bipush 40
  17. 18: istore_1
  18. 19: goto 26
  19. 22: astore_2
  20. 23: bipush 50
  21. 25: istore_1
  22. 26: return
  23. Exception table:
  24. from to target type
  25. 2 5 8 Class java/lang/ArithmeticException
  26. 2 5 15 Class java/lang/NullPointerException
  27. 2 5 22 Class java/lang/Exception
  28. LineNumberTable: ...
  29. LocalVariableTable: // 因为异常最终只会出现一种,这里采用了异常引用变量的槽位复用
  30. Start Length Slot Name Signature
  31. 9 3 2 e Ljava/lang/ArithmeticException;
  32. 16 3 2 e Ljava/lang/NullPointerException;
  33. 23 3 2 e Ljava/lang/Exception;
  34. 0 27 0 args [Ljava/lang/String;
  35. 2 25 1 i I
  36. StackMapTable: ...

上述说明: 

  1. 因为异常出现时,只能进入 Exception table 中一个分支,所以局部变量表 slot 2 位置被共用。也算是一种优化,为节省栈帧内存的使用

1.3 异常-multicatch

先来看下异常-multi_catch代码示例:

  1. // 从字节码角度来分析:multi-catch 的情况
  2. // jdk1.7 新增multi catch
  3. public class T15_ByteAnalyseMulti_Catch {
  4. public static void main(String[] args) {
  5. try {
  6. Method test = T15_ByteAnalyseMulti_Catch.class.getMethod("test");
  7. test.invoke(null);
  8. } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. public static void test() {
  13. System.out.println("ok");
  14. }
  15. }

上述代码通过:javap -v T15_ByteAnalyseMulti_Catch.class进行反编译,得到如下字节码。

  1. public static void main(java.lang.String[]);
  2. descriptor: ([Ljava/lang/String;)V
  3. flags: ACC_PUBLIC, ACC_STATIC
  4. Code:
  5. stack=3, locals=2, args_size=1
  6. 0: ldc #2 // class com/jvm/t07_bytecode/T15_ByteAnalyseMulti_Catch
  7. 2: ldc #3 // String test
  8. 4: iconst_0
  9. 5: anewarray #4 // class java/lang/Class
  10. 8: invokevirtual #5 // Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
  11. 11: astore_1
  12. 12: aload_1
  13. 13: aconst_null
  14. 14: iconst_0
  15. 15: anewarray #6 // class java/lang/Object
  16. 18: invokevirtual #7 // Method java/lang/reflect/Method.invoke:(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
  17. 21: pop
  18. 22: goto 30
  19. 25: astore_1
  20. 26: aload_1
  21. 27: invokevirtual #11 // e.printStackTrace:()V
  22. 30: return
  23. Exception table:
  24. from to target type
  25. 0 22 25 Class java/lang/NoSuchMethodException
  26. 0 22 25 Class java/lang/IllegalAccessException
  27. 0 22 25 Class java/lang/reflect/InvocationTargetException
  28. LineNumberTable: ...
  29. LocalVariableTable:
  30. Start Length Slot Name Signature
  31. 12 10 1 test Ljava/lang/reflect/Method;
  32. 26 4 1 e Ljava/lang/ReflectiveOperationException;
  33. 0 31 0 args [Ljava/lang/String;

上述说明: 

  1. 异常-multi_catch  字节码 对比 异常-多个catch字节码,并没有特别的地方,只是异常表Exception table 三个异常的 target都一致。也有 异常-多个catch字节码 异常对象引用在局部变量表中槽位复用。

文章最后,给大家推荐一些受欢迎的技术博客链接:

  1. Hadoop相关技术博客链接
  2. Spark 核心技术链接
  3. JAVA相关的深度技术博客链接
  4. 超全干货--Flink思维导图,花了3周左右编写、校对
  5. 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
  6. 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
  7. 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂

 


欢迎扫描下方的二维码或 搜索 公众号“10点进修”,我们会有更多、且及时的资料推送给您,欢迎多多交流!

                                           

       

注:本文转载自blog.csdn.net的不埋雷的探长的文章"https://blog.csdn.net/weixin_32265569/article/details/108024235"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top