try-catch-finally的先后执行顺序讲解

1.try-catch-finally中都没有return的情况

1.1 执行try-finally

public class FinallyTest1 {
   @Test
   public void test(){
       try{
           String str="12";
           int i=Integer.parseInt(str);
           System.out.println(1);
       }catch(NumberFormatException e){
           System.out.println(-1);
       }finally{
           System.out.println("test结束");
       }
   }

执行结果为
在这里插入图片描述
解析

第一步:将str="12"转换为int类型的数据,由于str的字符串内容为整形,所以转换成功(没有触发catch)
String str=“12”;
int i=Integer.parseInt(str);
第二步:打印try中的1
System.out.println(1);
第三步:执行finally中的输出语句
System.out.println(“test结束”);

1.2 执行catch-finally

public class FinallyTest1 {
   @Test
   public void test(){
       try{
           String str="abc"; (同样是上面的那段代码,只是将“12”换成类“abc”)
           int i=Integer.parseInt(str);
           System.out.println(1);
       }catch(NumberFormatException e){
           System.out.println(-1);
       }finally{
           System.out.println("test结束");
       }
   }

执行结果为
在这里插入图片描述
解析

第一步:将str="12"转换为int类型的数据,由于str的字符串内容为字符,所以转换不成功(触发catch)
String str=“12”;
int i=Integer.parseInt(str);
第二步:打印catch中的-1
System.out.println(-1);
第三步:执行finally中的输出语句
System.out.println(“test结束”);


2.try-catch中有return,finally中没有return的情况

public class FinallyTest2 {
    public static void main(String[] args) {
        int result = test("12");
        System.out.println(result);
    }

    public static int test(String str) {
        try {
            Integer.parseInt(str);
            return 1;
        } catch (NumberFormatException e) {
            return -1;
        } finally {
            System.out.println("test结束");
        }
    }
}

执行结果为
在这里插入图片描述

解析**:

首先,我们需要了解栈的概念:
栈:存函数的临时变量,即局部变量,函数返回时随时有可能被其他函数栈用。
所以说,当我们调用 “test()” 方法时,会先将return后面的表达式进行计算,得到的值存放在栈中。

第一步:在try中,将“12”转换为int类型,计算return后面的表达式,得到的值存放在栈中,但不返回!!!
try {
Integer.parseInt(str);
return 1;
}
第二步:执行finally中的打印“test结束”
finally {
System.out.println(“test结束”);
}
第三步:这时候执行return,将刚刚保存在栈中的值返回到main()中,并进行打印。
return 1;

重点就是:
当try-catch中有return,finally中没有return时,
会先计算try-catch的return后面表达式的值,将结果存放在栈中,
再执行finally内容
最后使用try或catch中的return返回我们刚刚保存在栈中的结果

3.try-catch-finally三者都有return

public class FinallyTest3 {
    public static void main(String[] args) {
        int result = test("12");
        System.out.println(result);
    }

    public static int test(String str) {
        try {
            Integer.parseInt(str);
            return 1;
        } catch (NumberFormatException e) {
            return -1;
        } finally {
            System.out.println("test结束");
            return 0;
        }
    }

运行结果为
在这里插入图片描述
解析

第一步:在try中,将“12”转换为int类型,计算return后面的表达式,得到的值存放在栈中,但不返回!!!
try {
Integer.parseInt(str);
return 1;
}
第二步:执行finally,打印“test()结束”,然后返回 “0”给main()方法(由于finally已经返回了,所以try不能返回了)。
finally {
System.out.println(“test结束”);
return 0;
}
第三步:main()方法得到返回值“0”,并打印“0”。
public static void main(String[] args) {
int result = test(“12”);
System.out.println(result);
}

重点就是:
当try-catch中有return,finally中也有return时,
会先计算try-catch的return后面表达式的值,将结果存放在栈中,
再执行finally内容,由于finally中的return先执行了,所以try或catch中的return执行不到了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值