java中finally子句的分析

参考:java中finally子句的分析

 

 

package com;

public class Test {

	public  static void main(String[] args ){
		System.out.println(test2());
	}
	
	public static String test2(){
		String aa= "aa";
		try {
//			System.out.println("try");
			return aa;
		}catch(RuntimeException e){
//			System.out.println("exception");
			aa="bb";
			return aa;
		}finally{
			aa = "cc";
//			System.out.println("finally");
		}
		
	}
}
 

 

 

javap -verbose Test >> 1.txt  后

 

1.txt的内容

 

 Compiled from "Test.java"

public class com.Test extends java.lang.Object

  SourceFile: "Test.java"

  minor version: 0

  major version: 49

  Constant pool:

const #1 = class#2;//  com/Test

const #2 = Ascizcom/Test;

const #3 = class#4;//  java/lang/Object

const #4 = Ascizjava/lang/Object;

const #5 = Asciz<init>;

const #6 = Asciz()V;

const #7 = AscizCode;

const #8 = Method#3.#9;//  java/lang/Object."<init>":()V

const #9 = NameAndType#5:#6;//  "<init>":()V

const #10 = AscizLineNumberTable;

const #11 = AscizLocalVariableTable;

const #12 = Ascizthis;

const #13 = AscizLcom/Test;;

const #14 = Ascizmain;

const #15 = Asciz([Ljava/lang/String;)V;

const #16 = Field#17.#19;//  java/lang/System.out:Ljava/io/PrintStream;

const #17 = class#18;//  java/lang/System

const #18 = Ascizjava/lang/System;

const #19 = NameAndType#20:#21;//  out:Ljava/io/PrintStream;

const #20 = Ascizout;

const #21 = AscizLjava/io/PrintStream;;

const #22 = Method#1.#23;//  com/Test.test2:()Ljava/lang/String;

const #23 = NameAndType#24:#25;//  test2:()Ljava/lang/String;

const #24 = Asciztest2;

const #25 = Asciz()Ljava/lang/String;;

const #26 = Method#27.#29;//  java/io/PrintStream.println:(Ljava/lang/String;)V

const #27 = class#28;//  java/io/PrintStream

const #28 = Ascizjava/io/PrintStream;

const #29 = NameAndType#30:#31;//  println:(Ljava/lang/String;)V

const #30 = Ascizprintln;

const #31 = Asciz(Ljava/lang/String;)V;

const #32 = Ascizargs;

const #33 = Asciz[Ljava/lang/String;;

const #34 = String#35;//  aa

const #35 = Ascizaa;

const #36 = String#37;//  cc

const #37 = Ascizcc;

const #38 = String#39;//  bb

const #39 = Ascizbb;

const #40 = class#41;//  java/lang/RuntimeException

const #41 = Ascizjava/lang/RuntimeException;

const #42 = AscizLjava/lang/String;;

const #43 = Ascize;

const #44 = AscizLjava/lang/RuntimeException;;

const #45 = AscizSourceFile;

const #46 = AscizTest.java;

 

{

public com.Test();

  Code:

   Stack=1, Locals=1, Args_size=1

   0:aload_0

   1:invokespecial#8; //Method java/lang/Object."<init>":()V

   4:return

  LineNumberTable: 

   line 3: 0

 

  LocalVariableTable: 

   Start  Length  Slot  Name   Signature

   0      5      0    this       Lcom/Test;

 

 

public static void main(java.lang.String[]);

  Code:

   Stack=2, Locals=1, Args_size=1

   0:getstatic#16; //Field java/lang/System.out:Ljava/io/PrintStream;

   3:invokestatic#22; //Method test2:()Ljava/lang/String;

   6:invokevirtual#26; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

   9:return

  LineNumberTable: 

   line 6: 0

   line 7: 9

 

  LocalVariableTable: 

   Start  Length  Slot  Name   Signature

   0      10      0    args       [Ljava/lang/String;

 

 

public static java.lang.String test2();

  Code:

   Stack=1, Locals=4, Args_size=0

   0:ldc#34; //String aa  从常量池中取出 "aa" 入操作数栈

   2:astore_0                  存放到局部变量第0个位置

   3:aload_0                   从局部变量的第0个位置,入操作数栈

   4:astore_3                  操作数栈出栈,放到局部变量的第3个位置

   5:ldc#36; //String cc    从常量池中取出"cc" 入操作数栈

   7:astore_0                    将"cc" 出栈, 放到局部变量的第0个位置, 相当于“cc” 替换"aa"

   8:aload_3                     将局部变量的第3个数据入栈(数据是"aa")

   9:areturn                      将操作数栈出栈, 无异常时,返回

   10:astore_1                    将异常对象保存到局部变量表中

   11:ldc#38; //String bb     

   13:astore_0

   14:aload_0

   15:astore_3                     将"bb"存放到局部变量第3个位置

   16:ldc#36; //String cc      

   18:astore_0                     将"cc"存放到局部变量第0个位置

   19:aload_3                       将第3个位置的数据入栈("bb")  

   20:areturn                       返回"bb", 有异常的返回

   21:astore_2                      异常存放到局部变量

   22:ldc#36; //String cc      "cc"入栈  

   24:astore_0     

   25:aload_2                       将异常入栈

   26:athrow                        向上抛出栈顶的元素(异常)

  Exception table:

   from   to  target type

     3     5    10   Class java/lang/RuntimeException   第3到5行中, 如果出现RuntimeException,则跳转到第10行,将异常保存到局部变量表中, 

     3     5    21   any    任何异常, 执行第21行

    10    16    21   any    任何异常, 执行第21行

  LineNumberTable: 

   line 10: 0

   line 13: 3

   line 19: 5

   line 13: 8

   line 14: 10

   line 16: 11

   line 17: 14

   line 19: 16

   line 17: 19

   line 18: 21

   line 19: 22

   line 22: 25

 

  LocalVariableTable: 

   Start  Length  Slot  Name   Signature

   3      24      0    aa       Ljava/lang/String;

   11      10      1    e       Ljava/lang/RuntimeException;

 

 

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值