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 语句块是用于保证无论出现什么情况,一定要执行的代码块。在 try-catch-finally 结构中,finally 语句块的执行顺序是非常重要的。下面我们来详细...
本项目为基于Java语言的系统后端优化设计源码,包含202个文件,其中包括181个Java源代码文件、14个XML配置文件、1个Git忽略文件、1个Markdown...该源码专注于finally子句的代码优化,旨在提升系统后端性能和稳定性。
在异常处理中,`finally`子句扮演着关键角色,确保某些代码无论是否发生异常都会被执行。这对于清理资源,如关闭文件、网络连接或者释放内存等操作至关重要。 在Java中,异常处理通过`try-catch-finally`结构实现。...
动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...
Java 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误或异常情况。下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出异常的关键字是 `...
译者序 前言 第1章 Java体系结构介绍 第2章 平台无关 第3章 安全 第4章 网络移动性 第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 ...第18章 finally子句
Java 中使用 List 遇到黄色警告...* `finally`:任何 finally 子句不能正常完成时的警告 * `all`:关于以上所有情况的警告 通过 `@SuppressWarnings` 批注,可以选择性地取消特定代码段中的警告,从而提高代码安全性。
System.out.println("这是 finally 子句"); } System.out.println("这是 try 语句后的代码"); } public static void main(String[] args) { for (int i = 1; i ; i++) { try { method(i); } catch ...
12. **异常处理**:Java 7允许在catch子句中捕获多个异常类型,简化了异常处理的代码。 13. **动态语言支持**:Java 7引入了JSR 292,提供了对动态语言的支持,使得Java平台可以更好地运行非静态类型的语言。 通过...
在 Java 中,我们可以使用 finally 语句来释放资源。finally 语句将在 try 语句块结束时执行,无论是否抛出异常。finally 语句通常用来释放资源,如关闭文件或释放内存。 在 Java 中,我们可以使用断言来检查条件...
- **finally子句**:无论是否发生异常,`finally`块中的代码都会被执行。通常用于释放资源等操作。 ##### 3.3 自定义异常 Java允许开发者创建自定义异常类,这些类通常继承自`Exception`类或其子类。通过自定义...
第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial 第21章 线程同步 附录A 按操作码助记符排列的指令集 附录B 按功能排列的操作码助记符 附录C 按操作码字节值排列的操作码助记符 附录D Java...
在 Java 编程语言中,有许多关键词和保留字,它们是语言的基本组成部分。下面是 Java 关键词大全的总结: 1. abstract 关键字 abstract 关键字可以修改类或方法。abstract 类可以扩展(增加子类),但不能直接实例...
在Java语言中,一定会执行完的代码是finally块。finally块用于释放资源、关闭文件、网络连接等,目的是为了保证程序的可靠性和安全性。 Java语言中的异常处理机制可以解决程序运行过程中发生的某些异常。异常是一种...
* 异常:异常处理应遵循一定的规则,例如try-catch 语句应包含至少一个 catch 子句,finally 子句可以省略。 * 习惯:编码习惯应遵循一定的规则,例如每行代码的长度不应超过 80 个字符,代码应包括适当的注释等。 ...
在Java面试中,了解final、finally、finalize的区别是非常重要的。final是一个修饰符(关键字),如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。将变量或方法声明为final,可以保证...
第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial 第21章 线程同步 附录A 按操作码助记符排列的指令集 附录B 按功能排列的操作码助记符 附录C 按操作码字节值排列的操作码助记符 附录D Java...
完整版,有书签。 第1章 Java体系结构介绍 第2章 平台无关 第3章 安全 第4章 网络移动性 第5章 Java虚拟机 ...第18章 finally子句 第19章 方法的调用与返回 第20章 指令invokespecial 第21章 线程同步
每个try块都必须至少有一个catch或finally子句。如果某个特定异常类未被任何catch子句处理,该异常将沿着调用栈递归地传播到下一个封闭try块。如果任何封闭try块都未捕获到异常,Java解释器将退出,并显示错误消息和...