JAVA学习-try...catch...finally结构的运行逻辑

在 Java 实际开发中,往往会遇到很多异常,对异常进行处理便是我们必备的一个技能,比较常见的就是 try...catch..finally 结构,今天我们就来讲讲这个结构的运行逻辑。

正常情况下:

public class Demo {
    public static void main(String[] args){
        System.out.println(getValue());
    }

    public static int getValue(){
        int value = 1;
        try{
            System.out.println("-----try 被执行了----");
            value = 2;
            System.out.println("-----try 要执行结束了----");
        }catch (Exception e){
            System.out.println("-----catch 被执行了----");
            value = -1;
        }
        finally {
            System.out.println("-----finally 被执行了----");
            value = 0;
        }
        return value;
    }
}

执行结果:

-----try 被执行了----
-----try 要执行结束了----
-----finally 被执行了----
0

因为没有发生异常,所以没有执行 catch 中的语句,先执行了 try 再执行了 finally。

异常情况:

public static int getValue(){
    int value = 1;
    try{
        System.out.println("-----try 被执行了----");
        value = 1 / 0;
        System.out.println("-----try 要执行结束了----");
    }catch (Exception e){
        System.out.println("-----catch 被执行了----");
        value = -1;
    }
    finally {
        System.out.println("-----finally 被执行了----");
        value = 0;
    }
    return value;
}

执行结果:

-----try 被执行了----
-----catch 被执行了----
-----finally 被执行了----
0

可以看出,因为出现异常,代码按着 try - catch - finally 的循序执行了,而且 try 中一出现异常就不运行后面的代码直接执行 catch 语句中的代码。

从上面两个例子可以看出,finally 语句是一定会被执行的,那么要是我将 return 语句卸载 try 语句 和 catch 语句中呢?

正常情况:

public static int getValue(){
    int value = 1;
    try{
        System.out.println("-----try 被执行了----");
        value = 2;
        System.out.println("-----try 要执行结束了----");
        return value;
    }catch (Exception e){
        System.out.println("-----catch 被执行了----");
        value = -1;
        return value;
    }
    finally {
        System.out.println("-----finally 被执行了----");
        value = 0;
    }
}

执行结果:

-----try 被执行了----
-----try 要执行结束了----
-----finally 被执行了----
2

这里可以看出 finally 确实被执行了,但是 value 的值却返回的是 2,按照执行循序来说,不应该返回 0 吗?那我们再来看看异常情况呢?

异常情况:

public static int getValue(){
    int value = 1;
    try{
        System.out.println("-----try 被执行了----");
        value = 1 / 0;
        System.out.println("-----try 要执行结束了----");
        return value;
    }catch (Exception e){
        System.out.println("-----catch 被执行了----");
        value = -1;
        return value;
    }
    finally {
        System.out.println("-----finally 被执行了----");
        value = 0;
    }
}

执行结果:

-----try 被执行了----
-----catch 被执行了----
-----finally 被执行了----
-1

是不是很奇怪,执行循序和之前执行循序一样,但是值却返回的 catch 语句中的值,那么我们可以去看看它的字节码是如何运行的,但是我没调出字节码,具体可以参考一下这个:

java中关于try、catch、finally中的细节分析 - 猫叔玩流量 - 博客园 (cnblogs.com)icon-default.png?t=M0H8https://www.cnblogs.com/aigongsi/archive/2012/04/19/2457735.html我就直接说原因了,因为 return 返回的是一个引用类型,再返回这个类型之前,系统会新建一个引用类型将原来引用类型的值付给它,而执行 finally 语句所赋值的是原来的引用类型,所以最后返回的值是 try 或 catch 语句中的值。

还有种情况,那就是 return 语句在 finally 语句中呢?

public static int getValue(){
    int value = 1;
    try{
        System.out.println("-----try 被执行了----");
        value = 1 / 0;
        System.out.println("-----try 要执行结束了----");
        return value;
    }catch (Exception e){
        System.out.println("-----catch 被执行了----");
        value = -1;
        return value;
    }
    finally {
        System.out.println("-----finally 被执行了----");
        value = 0;
        return value;
    }
}

结果:

-----try 被执行了----
-----catch 被执行了----
-----finally 被执行了----
0

可以看到虽然 try 语句和 catch 语句都有 return 语句,但是最终返回的依然是 finally 语句中修改的值。

综上所述,我们将try...catch...finally结构的运行逻辑分为以下三点:

  1. 先执行 try 语句,有异常执行 catch 语句并且不运行 try 语句报异常位置为后面代码,finally 语句一定被执行。
  2. try 或 catch 语句中存在 return 语句,在执行 return 语句之前一定会运行 finally 语句中的代码,但是 finally 语句对返回的值做的修改不会影响原来的返回值。
  3. finally 语句中的 return 语句一定会被返回。

想要了解更多关于异常的知识,推荐去看看这个大佬的:

Java中的try-catch-finally异常处理 - StarHai - 博客园 (cnblogs.com)icon-default.png?t=M0H8https://www.cnblogs.com/csushl/p/11973468.html不积跬步无以至千里,不积小流无以成江海,多动手实践一下才能真正理解。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什巳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值