`
wanxiaotao12
  • 浏览: 456023 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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;

 

 

}

 

分享到:
评论

相关推荐

    java 中finally语句块与return的执行关系

    finally语句块与return的执行关系

    详解Java异常处理中finally子句的运用

    主要介绍了Java异常处理中finally子句的运用,是Java入门学习中的基础知识,需要的朋友可以参考下

    动力节点_Java基础视频教程154_finally子句

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

    Java关键字finally_动力节点Java学院整理

    java关键字finally不管是否出现异常,finally子句总是在块完成之前执行。下面通过实现代码给大家介绍Java关键字finally相关知识,需要的的朋友参考下吧

    深入JAVA虚拟机第二版.pdf 目录

    译者序 前言 第1章 Java体系结构介绍 第2章 平台无关 第3章 安全 第4章 网络移动性 第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 ...第18章 finally子句

    深入Java虚拟机(原书第2版)及书中源代码

    第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial 第21章 线程同步 附录A 按操作码助记符排列的指令集 附录B 按功能排列的操作码助记符 附录C 按操作码字节值排列的操作码助记符 附录D Java...

    深入java虚拟机中文第2版

    第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial 第21章 线程同步 附录A 按操作码助记符排列的指令集 附录B 按功能排列的操作码助记符 附录C 按操作码字节值排列的操作码助记符 附录D Java...

    深入java虚拟机

    完整版,有书签。 第1章 Java体系结构介绍 第2章 平台无关 第3章 安全 第4章 网络移动性 第5章 Java虚拟机 ...第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial 第21章 线程同步

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    第18章 finally子句 18.1 微型子例程 18.2 不对称的调用和返回 18.3 一个模拟:“hop around” 18.4 随书光盘 18.5 资源页 第19章 方法的调用与返回 19.1 方法调用 19.1.1 java方法的调用 19.1.2...

    常用JAVA面试题大全

    子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize —方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个...

    21天学会java开发网络游戏

    如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理...

    Java面试题及答案(面试题集锦)

    Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承...

    JAVA基础课程讲义

    JAVA中如何实现多线程(重点!!) 168 通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 ...

    JAVA面试题最全集

    子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这...

    JAVA程序设计实验

    (1) 定义一个类,在main方法的try块中产生并抛出一个异常,在catch块中捕获异常,并输出相应信息,同时加入finally子句,输出信息,证明它的无条件执行。 (2) *定义一个类Caculate实现10以内的整数加减法的计算...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    JAVA 面试32问

    如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。 finalize 方法名。Java 技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这...

    Java学习笔记

    其中的代码语句论有没有异常都会被执行(因为finally子句的这个特性,所以一般将释放资源,关闭连接的语句写在里面)。 finally中的代码和try-catch中的代码冲突时,finally中的代码一定会被执行且会忽略try-catch中...

    深入Java虚拟机

    第18章 finally子句 18.1 微型子例程 18.2 不对称的调用和返回 18.3 一个模拟:“Hop Around” 18.4 随书光盘 18.5 资源页 第19章 方法的调用与返回 19.1 方法调用 19.1.1 Java方法的调用 19.1.2...

Global site tag (gtag.js) - Google Analytics