关于Gen生成try-catch-finally
例1:
class TestExc extends Exception{} void tryItOut () throws TestExc{} void handleExc(Object o){} void catchOne() { try { tryItOut(); } catch (TestExc e) { handleExc(e); } }
生成的class文件的格式如下:
void catchOne(); flags: Code: stack=2, locals=2, args_size=1 0: aload_0 1: invokevirtual #2 // Method tryItOut:()V 4: goto 13 7: astore_1 8: aload_0 9: aload_1 10: invokevirtual #4 // Method handleExc:(Ljava/lang/Object;)V 13: return Exception table: from to target type 0 4 7 Class com/test19/Test04$TestExc
其中的catchOne()方法的code码如下:
2A B6 00 02 A7 00 09 4C 2A 2B B6 00 04 B1 opcode [2A] - 0000: aload_0 opcode [B6] - 0001: invokevirtual 2 [Methodref: com.test19.Test04.tryItOut, parameter = (), returns = void] opcode [A7] - 0004: goto 9 opcode [4C] - 0007: astore_1 opcode [2A] - 0008: aload_0 opcode [2B] - 0009: aload_1 opcode [B6] - 0010: invokevirtual 4 [Methodref: com.test19.Test04.handleExc, parameter = (java.lang.Object), returns = void] opcode [B1] - 0013: return
例2:
如上的例子与如下的例子生成的class文件一样,但是Exception Table不一样:
class TestExc1 extends Exception{} class TestExc2 extends Exception{} void tryItOut () throws TestExc1,TestExc2{} void handleExc1(Object o){} void handleExc2(Object o){} void nestedCatch() { try { tryItOut(); } catch (TestExc1 e) { handleExc1(e); } catch (TestExc2 e) { handleExc2(e); } }
生成的class文件的格式如下:
void nestedCatch(); flags: Code: stack=2, locals=2, args_size=1 0: aload_0 1: invokevirtual #2 // Method tryItOut:()V 4: goto 22 7: astore_1 8: aload_0 9: aload_1 10: invokevirtual #4 // Method handleExc1:(Ljava/lang/Object;)V 13: goto 22 16: astore_1 17: aload_0 18: aload_1 19: invokevirtual #6 // Method handleExc2:(Ljava/lang/Object;)V 22: return Exception table: from to target type 0 4 7 Class com/test19/Test07$TestExc1 0 4 16 Class com/test19/Test07$TestExc2
再举个例子,如下:
void tryItOut () throws TestExc1,TestExc2{} class TestExc1 extends Exception{} class TestExc2 extends Exception{} void handleExc1(Object o){} void handleExc2(Object o){} void nestedCatch() { try { try { tryItOut(); } catch (TestExc1 e) { handleExc1(e); } } catch (TestExc2 e) { handleExc2(e); } }
生成的class文件内容如下:
void nestedCatch(); flags: Code: stack=2, locals=2, args_size=1 0: aload_0 1: invokevirtual #2 // Method tryItOut:()V 4: goto 13 7: astore_1 8: aload_0 9: aload_1 10: invokevirtual #4 // Method handleExc1:(Ljava/lang/Object;)V 13: goto 22 16: astore_1 17: aload_0 18: aload_1 19: invokevirtual #6 // Method handleExc2:(Ljava/lang/Object;)V 22: return Exception table: from to target type 0 4 7 Class com/test19/Test04$TestExc1 0 13 16 Class com/test19/Test04$TestExc2
例3:
void tryItOut () {} void wrapItUp () {} void tryFinally() { try { tryItOut(); } finally { wrapItUp(); } }
生成的class文件格式如下:
void tryFinally(); flags: Code: stack=1, locals=2, args_size=1 0: aload_0 1: invokevirtual #2 // Method tryItOut:()V 4: aload_0 5: invokevirtual #3 // Method wrapItUp:()V 8: goto 18 11: astore_1 12: aload_0 13: invokevirtual #3 // Method wrapItUp:()V 16: aload_1 17: athrow 18: return Exception table: from to target type 0 4 11 any 11 12 11 any
例4:
int tryFinally() { try { int i = 1; return i; } finally { int j = 2; return j; } }
生成的class文件内容如下:
int tryFinally(); flags: Code: stack=1, locals=6, args_size=1 0: iconst_1 1: istore_1 2: iload_1 3: istore_2 // 由于要运行finally,所以需要将这个return的值暂时存储到本地变量表中 4: iconst_2 5: istore_3 6: iload_3 7: ireturn 8: astore 4 // 将异常引用类型存储到本地变量表4的位置 10: iconst_2 11: istore 5 13: iload 5 // 将本地变量表5的位置加载到栈中,因为finally中的return值要做为最终值返回 15: ireturn Exception table: from to target type 0 4 8 any 8 10 8 any
例5:
void tryItOut () {} void wrapItUp1 () {} void wrapItUp2 () {} int tryFinally() { try { try { int i = 1; return i; } finally { wrapItUp1(); } } finally { wrapItUp2(); } }
则生成的代码如下:
stack=1, locals=5, args_size=1 0: iconst_1 1: istore_1 2: iload_1 3: istore_2 // 将变量i的值存储到本地变量表2的位置,以便返回 4: aload_0 5: invokevirtual #2 // Method wrapItUp1:()V 8: aload_0 9: invokevirtual #3 // Method wrapItUp2:()V 12: iload_2 // 从本地变量表2的位置取出返回数并返回 13: ireturn 14: astore_3 // 将异常存储到本地变量表3的位置 15: aload_0 16: invokevirtual #2 // Method wrapItUp1:()V 19: aload_3 // 在这里抛出异常后,在异常表中查看跳转到target, // 则清空当前操作数栈,异常重新入栈,程序继续执行 20: athrow 21: astore 4 // 将异常存储到本地变量表4的位置 23: aload_0 24: invokevirtual #3 // Method wrapItUp2:()V 27: aload 4 29: athrow Exception table: from to target type 0 4 14 any 14 15 14 any 0 8 21 any 14 23 21 any
例6:
class TestExc1 extends Exception{} class TestExc2 extends Exception{} void tryItOut () throws TestExc1,TestExc2{} void handleExc1(Object o){} void handleExc2(Object o){} void wrapItUp () {} void nestedCatch() { try { tryItOut(); } catch (TestExc1 e) { handleExc1(e); } catch (TestExc2 e) { handleExc2(e); }finally { wrapItUp(); } }
关于Gen生成try-catch-finally的更多相关文章
- idea 自动生成try/catch代码块的快捷键
好像每个人的快捷键可能不同:我的是 Alt+Shift+Z 网上查的是 Ctrl+Alt+T 如果都不是可以点选工具栏生成try/catch(并可查看到自己的快捷键是什么):Code->Su ...
- C#生成带项目编号的Word段落
using System; using Microsoft.Office.Interop.Word; using Word = Microsoft.Office.Interop.Word; names ...
- Eclipse用法和技巧八:自动添加try/catch块1
站在编译器的角度来看,java中的异常可以分为两种,已检查异常和未检查异常.对于已检查异常比如IO操作,编译器会要求设置try/catch语句块,在eclipse中也只要使用帮助快捷键ctrl+1,就 ...
- java生成二维码(最初版)
研究了2个小时,发现自己竟然智障,用原先的图片覆盖另一个图片 package com.tz.util; import java.awt.Color;import java.awt.Graphics2D ...
- 用SAX和PULL进行XML文件的解析与生成
XML解析有传统的dom方法还有Jsoup,SAX,PULL等,这里讲的是比较省内存的SAX和PULL方法.Android中极力推荐用PULL的方式来解析,我个人觉得pull确实比较简单,但其内部的逻 ...
- java图片裁剪和java生成缩略图
一.缩略图 在浏览相冊的时候.可能须要生成相应的缩略图. 直接上代码: public class ImageUtil { private Logger log = LoggerFactory.getL ...
- java使用freemarker生成静态html页面
1. 模板文件static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- Android 如何修改gen下包的名字
前言 当将项目中包进行重命名后,所有包名字修改了,但是在gen目录下android sdk 自动生成的包名并没有修改,如果要引用R.java 中的字段, 又得import以前的包名字. 原因 出现 ...
- JAVA使用qrcode生成二维码(带logo/不带logo)
/** * */ package qrcode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; i ...
随机推荐
- VS2010程序打包操作--超详细
1. 在vs2010 选择“新建项目”----“其他项目类型”----“Visual Studio Installerà“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, ...
- 四)mybatis 二级缓存 ehcache 常见问题
1. java.io.NotSerializableException 94359 [EH_CACHE Async Replication Thread] ERROR n.s.e.d.jgroups. ...
- Global Mapper
https://blog.csdn.net/mrib/article/details/75116373 http://www.bluemarblegeo.com/products/global-map ...
- (dp)Tickets --HDU --1260
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1260 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- php学习之路-笔记分享20150327
由于公司需要,不得已是php也学习并用了段时间做了两个项目,现也分享出笔记.需要源文档的留下邮箱,.
- Java对象的serialVersion序列化和反序列化
Java基础学习总结——Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种 ...
- [label][翻译][JavaScript]如何使用JavaScript操纵radio和check boxes
Radio 和 check boxes是form表单中的一部分,允许用户通过鼠标简单点击就可以选择.当与<textarea>元素的一般JavaScript操纵相比较,这些表单控件(form ...
- Web 平台安装程序 5.0(Microsoft Web Platform Installer) 由于修改常用选择不正确导致打开就报错
如图: 解决方案.第一步先卸载 Web 平台安装程序 5.0 第二步 将你添加配的文件删除 第三步:重新安装就可以了
- Keil下Debug随笔
很多时候我们需要通过硬件仿真来调试程序,在仿真时有时候会遇到这样的情况,那就是选择全速运行时,我们的全局变量无法随时更新,而在那设一个断点后发现值是变化的,那么为什么会出现这种情况呢,那就是可能是我们 ...
- Day 10 动态参数&名称空间,局部全部.函数嵌套&global nonlocal关键字.
一.动态参数#形参 有3种动态参数#*args 动态参数,不定长参数def func (*args): print(args,type(args))func(1,2,"alex", ...