• 【Java异常易错点】try或catch语句块中return后,finally还会执行吗?


    发现问题,提出疑问

    出现这个疑问是我遇到了一道题:
    在这里插入图片描述
    分析题目:
    1、第一个输出:num为0的时候,分母为0,那么便会报出异常java.lang.ArithmeticException(这里是针对整型运算分母为0的情况,浮点型可不会抛出异常),抛出异常就执行catch语句,那么就返回 0?那这时候的finally还会执行吗?
    2、针对第二个输出:num为1 的时候,在try语句块中result应该是为2的,随后又return result?那此时finally 还会执行吗?

    进行测试

    我们可以对这个问题进行调试,然后就知道它会不会执行finally啦。
    我们先测试catch语句块中return后,finally还会执行吗?
    【1】、我们在System.out.println(getNumber(0));设置断点,下一个输出1的那个位置结束,测试一下:
    在这里插入图片描述
    然后我们开始调试,一步一步进行下去:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    输出了-1,说明返回的是finally中的 return。
    【2】、我们再测试一下num为1 的时候,看看try 中return后还会不会执行finally,且返回值。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    执行了finally 中的return。

    初步得出结论

    即使 try或catch语句块中有return语句,finally也是会执行的,而且最后返回值取决于finally中的返回值。

    理论概述

    Java官方文档有下面一句话:

    The finally Block
    The finally block always executes when the try block exits.

    当try语句块退出时,finally语句块总是会执行的。这种特性可以让程序员避免在try语句中使用了return, continue或者 break关键字而忽略了关闭相关资源的操作。把清理相关资源放到 finally 语句块中一直是最佳实践。(catch语句块也是一样的,因为catch 语句块依赖于try 嘛)
    通过这题我们还可以得出结论:
    1、try 中有返回值只是一种以暂存的形式存在,还得看finally有没有具体的return,如果存在那么那个暂存的将会被排除在外,以finally中的为主。

  • 相关阅读:
    为什么需要 Buffer Pool?
    斯坦福发布 最新 GPT 模型排行榜 AlpacaEval
    Kafka 分区机制详解
    题目:2765.最长交替子序列
    失落的方舟台服预下载教程 一键下载+账号注册教程
    深度学习自编码器 - 引言篇
    关于专利技术交底书分类的真相
    Android线程优化——整体思路与方法
    一零四、大数据可视化技术与应用实训(展示大屏幕)
    robots.txt漏洞
  • 原文地址:https://blog.csdn.net/qq_63691275/article/details/127612948