关于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 ...
随机推荐
- wordpaster更新说明
官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/wordpaster/index.aspx 在线演示:FCKEditor2x示例 ...
- (最小生成树)Jungle Roads -- HDU --1301
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1301 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 来回最短路POJ3268
这个题得主要考点在于给你的图是去了再回来得有向图,如何模块化解决呢就是转变图的方向,我们根据初始得放心求出每个点到x得最短路,然后转变所有路得方向再求出所有点到x得最短路,最后一相加就是最后的来回了~ ...
- 团队作业(HCL队)第三周—需求改进和系统分析
2.需求&原型改进: 1.问题:游戏中坦克的移动和攻击怎么控制的? 改进: 在游戏中,我控制我方坦克,按下方向键坦克便向按下的方向移动,按下Z键,我方坦克发射炮弹.敌方坦克面向随机的方向移动, ...
- c3p0----获取不到链接
最近别人的项目,因为经常获取不到链接出错,我好奇也就跟着摆弄了一把,使用的插件是:c3p0+spring+ibatiS,当然事务管理部分也配置上了配置如下: <bean id="dat ...
- Tempdb--关于表变量的一点疑问和测试
在思考表变量与临时表之间区别时,表变量不会受事务回滚的影响,那么是否意味着表变量无需写入日志呢? 测试方式: 分别对tempdb上的用户表/临时表/表变量 进行10000次插入,查看日志写入次数,使用 ...
- javascript快速排序的思考
还记得三个月前,学习过快速排序,示例所讲的python快速排序十分易于理解,然而网上学习的c#的快速排序当时就懵逼的,现在已经全忘了,大概记得个思路 在学习完了一些高级的js方法后,今天用js模拟了p ...
- Spring 开发第一步(四)Spring与JDBC事务
Spring使用各种不同的TransactionManager来管理各种不同数据源事务底层(比如jdbc数据源.hibernate数据源.JPA数据源等等).在此基础上使用各种对应的Template来 ...
- Word发表blog格式模板
一级标题(黑体,二号,加粗) 二级标题(黑体,三号,加粗) 正文(宋体+Times New Roman,小四) 注意事项: 序号列表"不连续"时,不得使用自动序号 连续(word连 ...
- vhosetuser 和 vhostuservlient 差异
Open vSwitch支持的vHost-user类型 在Open vSwitch中vHost User通过socket进行通信,模式为client-server,其中server端负责创建/管理/销 ...