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;
}