java try..catch..finally return使用


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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值