首先,先说为什么。
在finally块中使用return,throw等,可以抑制在try或catch块中抛出的任何未被处理的Throwable异常。
为了说明原因,我写了个demo。
public class TryReturn {
public static void main(String[] args) {
mtd1();
mtd1();
mtd3();
}
/**
* finally 中return会阻止异常抛出
*/
public static void mtd1() {
try {
int a = 2 / 0;
} finally {
return;
}
}
/**
* finally 中throw会组织异常抛出
*/
public static void mtd2() {
try {
int a = 2 / 0;
} finally {
throw new RuntimeException("我错了");
}
}
public static void mtd3() {
int a = 2 / 0;
}
}
运行结果如图1所示。
果然,finally中的throw,return抑制了异常抛出。
一、栈帧解析
要知道,每一个方法的调用到执行完成,都伴随着一个栈帧在虚拟机栈中入栈和出栈。可以参考运行时栈帧结构。在这里我们只需要知道。
- 局部变量表是用来存放方法的参数和方法内部的局部变量的。
- 在方法的执行过程中,各种字节码指令往操作数栈中写入和提取内容。
二、反汇编解析
在了解了栈帧的两个重要概念之后,我们开始反汇编解析。我们使用javap -v TryReturn
反汇编我们的class字节码文件。
Classfile /home/fengli/Desktop/test/TryReturn.class
Last modified Aug 20