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

目录

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

1.1 异常-catch

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

public class T13_ByteAnalyseException {

public static void main(String[] args) {

int i = 0;

try {

i = 10;

} catch (Exception e) {

i = 20;

}

}

}

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

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

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的结构,[from, to)是前闭后开的检测范围,一旦这个范围内的字节码执行出现异常,则通过type匹配异常类型,如果一致,进入target所指示行号

8行的字节码指令 astore_2 是将异常对象引用存入局部变量表的 slot 2号位置

1.2 异常-多个catch

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

// 从字节码角度来分析:多个 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进行反编译,得到如下字节码。

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: // 因为异常最终只会出现一种,这里采用了异常引用变量的槽位复用

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: ...

上述说明:

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

1.3 异常-multicatch

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

// 从字节码角度来分析: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进行反编译,得到如下字节码。

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

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

本文地址:https://blog.csdn.net/weixin_32265569/article/details/108024235

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html特效大全1

提前声明&#xff1a;好久之前的文档&#xff0c;找不着出处&#xff0c;如有侵权&#xff0c;联系本人&#xff0c;马上处理&#xff01; 1) 贴图&#xff1a;<imgsrc"图片地址"> 2)加入连接&#xff1a;<a href"所要连接的相关地址">写上你…

.Net Core 系列:1、环境搭建

前言&#xff1a; 2016年6月28日微软宣布发布 .NET Core 1.0、ASP.NET Core 1.0 和 Entity Framework Core 1.0。 .NET Core是微软在两年前发起的开源跨平台.NET框架项目&#xff0c;支持Windows、OS X和Linux平台&#xff0c;可用于开发各种类型的应用。此次发布包括了 .NET C…

【集合框架】JDK1.8源码分析之HashMap(一)

转载自 【集合框架】JDK1.8源码分析之HashMap&#xff08;一&#xff09;一、前言在分析jdk1.8后的HashMap源码时&#xff0c;发现网上好多分析都是基于之前的jdk&#xff0c;而Java8的HashMap对之前做了较大的优化&#xff0c;其中最重要的一个优化就是桶中的元素不再唯一按照…

java 连接 sql2005,java与sql server2005 连接有关问题

当前位置:我的异常网 Eclipse java与sql server2005 连接有关问题java与sql server2005 连接有关问题www.myexceptions.net 网友分享于&#xff1a;2013-01-27 浏览&#xff1a;73次java与sql server2005 连接问题package com.lzw.dao;import internalFrame.guanli.Item;imp…

微软借Bletchley项目将云计算信息加入区块链

在比特币领域大获成功后&#xff0c;越来越多的行业开始尝试通过区块链&#xff08;Blockchain&#xff09;技术在自己的业务中实施分布式分类帐&#xff08;Ledger&#xff09;。 InfoQ 什么是区块链 区块链是一种用于创建数字交易分类帐的数据结构&#xff0c;或有关某笔交易…

php定时某个时间循环做,PHP定时循环执行脚本

代码如下&#xff1a;<?php ignore_user_abort(); //关掉浏览器&#xff0c;PHP脚本也可以继续执行.set_time_limit(0); // 通过set_time_limit(0)可以让程序无限制的执行下去$interval 43200; // 每隔*秒运行&#xff0c;这里是12小时执行一次$is_send true;//是否开启t…

LinkedList 的实现原理浅析

转载自 LinkedList 的实现原理浅析 LinkedList内部结构 查看LinkedList的源码&#xff0c;发现其继承自AbstractSequentialList&#xff0c;实现了List&#xff0c;Deque&#xff0c;Cloneable以及Serializable接口&#xff0c;如&#xff1a; 也就意味着&#xff1a; Linked…

移植.NET Core计划,整合各平台变得更简单了!

在前篇文章中我提到了如何移植 .NET Core&#xff0c;并邀请使用者们不吝啬的回报您的使用经验和改进意见。 这项措施带动起了非常多使用者之间的讨论。 根据这些讨论的重点和我们与第一与第三方伙伴合作的经验&#xff0c;我们决定把核心 API 跟其他 .NET 平台&#xff0c;主要…

browserquest php安装,请问一下browserquest-php项目换成GatewayWorker的形式需要怎么部署worker...

单进程模式用户间数据容易共享browserquest本身就设计成单进程模式&#xff0c;单进程模式用户间数据容易共享&#xff0c;不用频繁的进程间通讯&#xff0c;开发简单。改成gateway网关模式利弊如果要改成多进程gateway网关模式&#xff0c;代码改动量会很大&#xff0c;要求开…

Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例

转载自 Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列&#xff0c;相当于 动态数组。与Java中的数组相比&#xff0c;它的容量能动态增长。它继承于AbstractList&#xff0c;实现了List, Random…

ASP.NET Core 介绍

原文&#xff1a;Introduction to ASP.NET Core作者&#xff1a;Daniel Roth、Rick Anderson、Shaun Luttin翻译&#xff1a;江振宇(Kerry Jiang)校对&#xff1a;许登洋(Seay)、魏美娟(初见)、姚阿勇(Mr.Yao) ASP.NET Core 是对 ASP.NET 的一次意义重大的重构。本文介绍了 ASP…

计量经济学自相关matlab,计量经济学 自相关性.ppt

(3)检验自相关性 ①残差图分析&#xff1a;在方程窗口中点击Resids按钮&#xff0c;所显示的残差图(图5.3.7所示)表明e呈现有规律的波动&#xff0c;预示着可能存在自相关性。 图5.3.7 残差图 运用GENR生成序列E&#xff0c;观察E&#xff0c;E(-1)图形(见图5.3.8)。 图5.3.8 E…

Java 并发工具包 java.util.concurrent 用户指南

转载自 Java 并发工具包 java.util.concurrent 用户指南 1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台&#xff0c;java.util.concurrent 包。这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类。在这个包被添加以前&#x…

JavaScript实现四则运算

编写一个带有两个变量和一个运算符的函数&#xff0c;调用时接收prompt输入 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.or…

mysql中select语句子句,了解mysql中select语句操作实例

Select的语法SELECT[ALL | DISTINCT | DISTINCTROW ][HIGH_PRIORITY][STRAIGHT_JOIN][SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT][SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]select_expr, ...[INTO OUTFILE file_name export_options| INTO DUMPFILE file…

通过几个Hello World感受.NET Core全新的开发体验

2016年6月27日&#xff0c;这是一个特殊的日子&#xff0c;微软全新的.NET开发平台.NET Core的RTM版本正式发布。我个人将.NET Core的核心特性归结为三点&#xff0c;它们的首字母组成一个非常好记的简称——COM&#xff0c;分别代表的含义Cross-Platform、Open-Source和Modula…

Java多线程(六)之Deque与LinkedBlockingDeque深入分析

转载自 Java多线程&#xff08;六&#xff09;之Deque与LinkedBlockingDeque深入分析 一、双向队列 DequeQueue除了前面介绍的实现外&#xff0c;还有一种双向的Queue实现Deque。这种队列允许在队列头和尾部进行入队出队操作&#xff0c;因此在功能上比Queue显然要更复杂。下图…

matlab边算边出图命令,Matlab:不包含边境和工具栏的figure(移除保存图片的白边)...

Matlab:不包含边界和工具栏的figure(移除保存图片的白边)当我们使用matlab的imshow命令显示图片时&#xff0c;会有白框和工具栏出现。在保存图片时会出现白色的边框。下面将说明如何去除这些显示。Matlab启动时运行脚本script.m&#xff0c;文件位置在~/matlab/ directory。在…

JavaScript实现复选框全选与全不选的效果

//里面涉及到几张图片&#xff0c;有需要的可以联系我要&#xff0c;直接私信我就行&#xff0c;每天在这个点都会上线&#xff0c;看到就回&#xff0c;或者从我的资料里面找我的联系方式&#xff0c;收到之后会发给你们的<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1…

ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行

之前两篇文章简析.NET Core 以及与 .NET Framework的关系和.NET Core的构成体系从总体上介绍.NET Core,接下来计划用一个系列对ASP.NET Core的运行原理进行剖析。 ASP.NET Core 是新一代的 ASP.NET&#xff0c;早期称为 ASP.NET vNext&#xff0c;并且在推出初期命名为ASP.NET …