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;
}
相关推荐
finally语句块与return的执行关系
主要介绍了Java异常处理中finally子句的运用,是Java入门学习中的基础知识,需要的朋友可以参考下
动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...
java关键字finally不管是否出现异常,finally子句总是在块完成之前执行。下面通过实现代码给大家介绍Java关键字finally相关知识,需要的的朋友参考下吧
译者序 前言 第1章 Java体系结构介绍 第2章 平台无关 第3章 安全 第4章 网络移动性 第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 ...第18章 finally子句
第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial 第21章 线程同步 附录A 按操作码助记符排列的指令集 附录B 按功能排列的操作码助记符 附录C 按操作码字节值排列的操作码助记符 附录D Java...
第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial 第21章 线程同步 附录A 按操作码助记符排列的指令集 附录B 按功能排列的操作码助记符 附录C 按操作码字节值排列的操作码助记符 附录D Java...
完整版,有书签。 第1章 Java体系结构介绍 第2章 平台无关 第3章 安全 第4章 网络移动性 第5章 Java虚拟机 ...第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial 第21章 线程同步
第18章 finally子句 18.1 微型子例程 18.2 不对称的调用和返回 18.3 一个模拟:“hop around” 18.4 随书光盘 18.5 资源页 第19章 方法的调用与返回 19.1 方法调用 19.1.1 java方法的调用 19.1.2...
子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize —方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个...
如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理...
Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承...
JAVA中如何实现多线程(重点!!) 168 通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 ...
子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这...
(1) 定义一个类,在main方法的try块中产生并抛出一个异常,在catch块中捕获异常,并输出相应信息,同时加入finally子句,输出信息,证明它的无条件执行。 (2) *定义一个类Caculate实现10以内的整数加减法的计算...
JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...
如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。 finalize 方法名。Java 技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这...
其中的代码语句论有没有异常都会被执行(因为finally子句的这个特性,所以一般将释放资源,关闭连接的语句写在里面)。 finally中的代码和try-catch中的代码冲突时,finally中的代码一定会被执行且会忽略try-catch中...
第18章 finally子句 18.1 微型子例程 18.2 不对称的调用和返回 18.3 一个模拟:“Hop Around” 18.4 随书光盘 18.5 资源页 第19章 方法的调用与返回 19.1 方法调用 19.1.1 Java方法的调用 19.1.2...