java try..catch..finally return使用
*************************
示例
package trytest;
public class MyTest {
public int fun(){
int i=1;
try {
return ++i;
}catch (Exception e){
System.out.println(e.getMessage());
}finally {
++i;
}
return i;
}
public static void main(String[] args){
System.out.println("返回结果:"+new MyTest().fun());
}
}
控制台输出
返回结果:2
**************
字节码
view ==> show bytecode
public class trytest/MyTest {
// compiled from: MyTest.java
// access flags 0x19
public final static INNERCLASS java/lang/invoke/MethodHandles$Lookup java/lang/invoke/MethodHandles Lookup
// access flags 0x1
public <init>()V
L0
LINENUMBER 3 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this Ltrytest/MyTest; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x1
public fun()I
TRYCATCHBLOCK L0 L1 L2 java/lang/Exception
TRYCATCHBLOCK L0 L1 L3 null
TRYCATCHBLOCK L2 L4 L3 null
L5
LINENUMBER 6 L5 //行号:6 ==> int i=1;
ICONST_1 //读取常量:1
ISTORE 1 //将常量写入局部变量表1的位置(0存储this对象)
//如果该方法为static方法,不存储this对象,指令为ISTORE 0
L0
LINENUMBER 9 L0 //行号:9 ==> return ++i;
IINC 1 1 //局部变量表1位置数据加1(数值变为2)
ILOAD 1 //加载局部变量表1位置处数据(数值为2)到操作数栈
ISTORE 2 //将数据(数值为2)存储到局部变量表2位置处
L1
LINENUMBER 13 L1 //行号:13 ==> ++i;
IINC 1 1 //局部变量表位置1处数据加1(数值变为3)
L6
LINENUMBER 9 L6 //行号:9 ==> return ++i;
ILOAD 2 //加载局部变量表中位置2处数据(数值为2)到操作数栈
IRETURN //将数据(数值为2)返回
L2
LINENUMBER 10 L2 //行号:10
FRAME FULL [trytest/MyTest I] [java/lang/Exception]
ASTORE 2 //存储异常对象到局部变量表位置2处
L7
LINENUMBER 11 L7 //行号:11 ==> System.out.println(e.getMessage());
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 2 //加载局部变量表位置2处的异常对象到操作数栈
INVOKEVIRTUAL java/lang/Exception.getMessage ()Ljava/lang/String; //调用e.getMessage()方法
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V //调用PrintStream.println()方法
L4
LINENUMBER 13 L4
IINC 1 1
L8
LINENUMBER 14 L8
GOTO L9
L3
LINENUMBER 13 L3
FRAME SAME1 java/lang/Throwable
ASTORE 3
IINC 1 1
L10
LINENUMBER 14 L10
ALOAD 3
ATHROW
L9
LINENUMBER 16 L9
FRAME SAME
ILOAD 1
IRETURN
L11
LOCALVARIABLE e Ljava/lang/Exception; L7 L4 2
LOCALVARIABLE this Ltrytest/MyTest; L5 L11 0
LOCALVARIABLE i I L0 L11 1
MAXSTACK = 2
MAXLOCALS = 4
// access flags 0x9
public static main([Ljava/lang/String;)V
L0
LINENUMBER 20 L0
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
NEW trytest/MyTest
DUP
INVOKESPECIAL trytest/MyTest.<init> ()V
INVOKEVIRTUAL trytest/MyTest.fun ()I
INVOKEDYNAMIC makeConcatWithConstants(I)Ljava/lang/String; [
// handle kind 0x6 : INVOKESTATIC
java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
// arguments:
"\u8fd4\u56de\u7ed3\u679c\uff1a\u0001"
]
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
L1
LINENUMBER 21 L1
RETURN
L2
LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
MAXSTACK = 3
MAXLOCALS = 1
}
*************************
示例
public class MyTest {
public static int fun(){
int i=1;
try {
return ++i;
}catch (Exception e){
System.out.println(e.getMessage());
}finally {
++i;
}
return i;
}
public static int fun2(){
int i=1;
try {
return ++i;
}catch (Exception e){
System.out.println(e.getMessage());
}finally {
return ++i;
}
}
public static int fun3(){
int i=1;
try {
throw new RuntimeException("\nfun3 出错了");
}catch (Exception e){
System.out.println(e.getMessage());
return ++i;
}finally {
++i;
}
}
public static int fun4(){
int i=1;
try {
throw new RuntimeException("\nfun4 出错了");
}catch (Exception e){
System.out.println(e.getMessage());
return ++i;
}finally {
return ++i;
}
}
public static void main(String[] args){
System.out.println("返回结果:"+fun());
System.out.println("返回结果2:"+fun2());
System.out.println("返回结果3:"+fun3());
System.out.println("返回结果4:"+fun4());
}
}
****************
控制台输出
返回结果:2
返回结果2:3
fun3 出错了
返回结果3:2
fun4 出错了
返回结果4:3