例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的更多相关文章

  1. idea 自动生成try/catch代码块的快捷键

    好像每个人的快捷键可能不同:我的是  Alt+Shift+Z 网上查的是  Ctrl+Alt+T 如果都不是可以点选工具栏生成try/catch(并可查看到自己的快捷键是什么):Code->Su ...

  2. C#生成带项目编号的Word段落

    using System; using Microsoft.Office.Interop.Word; using Word = Microsoft.Office.Interop.Word; names ...

  3. Eclipse用法和技巧八:自动添加try/catch块1

    站在编译器的角度来看,java中的异常可以分为两种,已检查异常和未检查异常.对于已检查异常比如IO操作,编译器会要求设置try/catch语句块,在eclipse中也只要使用帮助快捷键ctrl+1,就 ...

  4. java生成二维码(最初版)

    研究了2个小时,发现自己竟然智障,用原先的图片覆盖另一个图片 package com.tz.util; import java.awt.Color;import java.awt.Graphics2D ...

  5. 用SAX和PULL进行XML文件的解析与生成

    XML解析有传统的dom方法还有Jsoup,SAX,PULL等,这里讲的是比较省内存的SAX和PULL方法.Android中极力推荐用PULL的方式来解析,我个人觉得pull确实比较简单,但其内部的逻 ...

  6. java图片裁剪和java生成缩略图

    一.缩略图 在浏览相冊的时候.可能须要生成相应的缩略图. 直接上代码: public class ImageUtil { private Logger log = LoggerFactory.getL ...

  7. java使用freemarker生成静态html页面

    1. 模板文件static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...

  8. Android 如何修改gen下包的名字

    前言 当将项目中包进行重命名后,所有包名字修改了,但是在gen目录下android sdk 自动生成的包名并没有修改,如果要引用R.java 中的字段, 又得import以前的包名字.   原因 出现 ...

  9. JAVA使用qrcode生成二维码(带logo/不带logo)

    /** * */ package qrcode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; i ...

随机推荐

  1. mysql图文安装教程(win7 32位 亲测)

    一.下载mysql:http://www.mysql.com/downloads/ 弹出: 你需要有一个 Oracle Web 帐户,没有的话,注册一个: 勾选许可: 输入搜索条件: 下载MySQL ...

  2. 软件工程网络15个人作业4(201521123010徐璐琳)——alpha阶段个人总结

    一.个人总结 1. 总结自己的alpha 过程: 经过了两周的ALPHA阶段,在这之中学习到了很多,因为最开始其实是有抱着一种应付的.将就着的心理去做这个小程序,但是在完成项目的过程中,有老师和助教一 ...

  3. 20155319 2016-2017-2 《Java程序设计》第九周学习总结

    20155319 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 整合数据库 ==16.1.1 JDBC简介== JDBC全名Java DataBase Co ...

  4. 对话框的按键处理 PreTranslateMessage、OnKeyDown和OnChar

    对话框的按键处理 PreTranslateMessage.OnKeyDown和OnChar 1.MFC对话框不能响应OnKeyDown和OnChar函数(1)现象  在MFC的对话框中,映射了WM_C ...

  5. linux信号量(转载)

    本文转载自http://blog.csdn.net/qinxiongxu/article/details/7830537 信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只 ...

  6. hdu 5015 233矩阵快速幂

    http://acm.hdu.edu.cn/showproblem.php?pid=5015 需要构造一个 n+2 维的矩阵. 就是要增加一维去维护2333这样的序列. 可以发现 2333 = 233 ...

  7. Html隐藏占空间与隐藏不占空间

    隐藏不占用空间: display:none; 以下为示例代码: <span style="display:none;"> 获取中</span> 隐藏占用空间 ...

  8. tf中softmax_cross_entropy_with_logits与sparse_softmax_cross_entropy_with_logits

    其实这两个都是计算交叉熵,只是输入数据不同. #sparse 稀疏的.稀少的 word_labels = tf.constant([2,0]) predict_logits = tf.constant ...

  9. python 判断是否为中文

    python在执行代码过程是不知道这个字符是什么意思的.是否是中文,而是把所有代码翻译成二进制也就是000111这种形式,机器可以看懂的语言. 也就是在计算机中所有的字符都是有数字来表示的.汉字也是有 ...

  10. Kafka send问题

    kafka 在send之后不会立即把消息发送到broker.会把消息发到producer所在电脑内存里,后端的IOThread会扫描内存,并从中取出消息进行消费. 在调用close()或者flush( ...