`
wanxiaotao12
  • 浏览: 467789 次
  • 性别: 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的执行关系

    Java 中 finally 语句块与 return 的执行关系 Java 中的 finally 语句块是用于保证无论出现什么情况,一定要执行的代码块。在 try-catch-finally 结构中,finally 语句块的执行顺序是非常重要的。下面我们来详细...

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

    在异常处理中,`finally`子句扮演着关键角色,确保某些代码无论是否发生异常都会被执行。这对于清理资源,如关闭文件、网络连接或者释放内存等操作至关重要。 在Java中,异常处理通过`try-catch-finally`结构实现。...

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

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

    java异常处理习题

    Java 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误或异常情况。下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出异常的关键字是 `...

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

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

    java中使用list会出现黄色警告图标如何去除参考.pdf

    Java 中使用 List 遇到黄色警告...* `finally`:任何 finally 子句不能正常完成时的警告 * `all`:关于以上所有情况的警告 通过 `@SuppressWarnings` 批注,可以选择性地取消特定代码段中的警告,从而提高代码安全性。

    实验五 Java异常处理实验.docx

    System.out.println("这是 finally 子句"); } System.out.println("这是 try 语句后的代码"); } public static void main(String[] args) { for (int i = 1; i ; i++) { try { method(i); } catch ...

    java基础第七章内部类与异常类.doc

    在 Java 中,我们可以使用 finally 语句来释放资源。finally 语句将在 try 语句块结束时执行,无论是否抛出异常。finally 语句通常用来释放资源,如关闭文件或释放内存。 在 Java 中,我们可以使用断言来检查条件...

    java 与c++的异常分析

    - **finally子句**:无论是否发生异常,`finally`块中的代码都会被执行。通常用于释放资源等操作。 ##### 3.3 自定义异常 Java允许开发者创建自定义异常类,这些类通常继承自`Exception`类或其子类。通过自定义...

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

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

    java关键词大全.doc

    在 Java 编程语言中,有许多关键词和保留字,它们是语言的基本组成部分。下面是 Java 关键词大全的总结: 1. abstract 关键字 abstract 关键字可以修改类或方法。abstract 类可以扩展(增加子类),但不能直接实例...

    2022国开形考任务-Java语言程序设计20.docx

    在Java语言中,一定会执行完的代码是finally块。finally块用于释放资源、关闭文件、网络连接等,目的是为了保证程序的可靠性和安全性。 Java语言中的异常处理机制可以解决程序运行过程中发生的某些异常。异常是一种...

    腾讯java编码规范

    * 异常:异常处理应遵循一定的规则,例如try-catch 语句应包含至少一个 catch 子句,finally 子句可以省略。 * 习惯:编码习惯应遵循一定的规则,例如每行代码的长度不应超过 80 个字符,代码应包括适当的注释等。 ...

    Java面试题,他会给你很好的Java面试准备,第一,谈谈final, finally, finalize的区别,第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

    在Java面试中,了解final、finally、finalize的区别是非常重要的。final是一个修饰符(关键字),如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。将变量或方法声明为final,可以保证...

    深入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关键字大全

    每个try块都必须至少有一个catch或finally子句。如果某个特定异常类未被任何catch子句处理,该异常将沿着调用栈递归地传播到下一个封闭try块。如果任何封闭try块都未捕获到异常,Java解释器将退出,并显示错误消息和...

    java实用组件集 源码

    Java的try-catch-finally结构和Checked与Unchecked异常的处理方式在源码中应有体现。 总的来说,这份“java实用组件集 源码”提供了丰富的学习材料,帮助开发者深入理解Java数据库操作,掌握JDBC的核心用法,以及...

    java面试题.pdf

    12. 在异常处理中,finally子句用于释放资源、关闭文件、关闭数据库等。 十三、抽象类与接口 13. 在Java中,抽象类可以有构造函数,但不能实例化。 14. 抽象方法的声明可以没有大括号,但实现抽象方法时必须用大...

Global site tag (gtag.js) - Google Analytics