当前位置: 首页 > news >正文

try catch finally 里面有return的执行顺序

目录

    • 实例
    • 结论

实例

1.try和catch中有return时,finally里面的语句会被执行吗 我们可以来分别看看
(1)执行try中的return时

public class Solution {public static int show() {try {return 1;}finally{System.out.println("finally模块被执行");}}public static void main(String args[]) {System.out.println(show());}
}

在这里插入图片描述
(2)执行catch中的return时

public class Solution {public static int show() {try {int a = 8/0;return 1;}catch (Exception e) {return 2;}finally{System.out.println("finally模块被执行");}}public static void main(String args[]) {System.out.println(show());}
}

在这里插入图片描述
我们可以得出结论: 如果程序是从try代码块或者catch代码块中返回时,finally中的代码总会执行。而且finally语句在return语句执行之后return返回之前执行的。

2.如果finally也有return的时候

public class Solution {public static int show() {try {int a = 8/0;return 1;}catch (Exception e) {return 2;}finally{System.out.println("finally模块被执行");return 0;}}public static void main(String args[]) {System.out.println(show());}
}

在这里插入图片描述
结论: 我们可以看到当finally有返回值时,会直接返回。不会再去返回try或者catch中的返回值。

3.finally中对于返回变量做的改变会影响最终的返回结果吗 我们先来看一看如果try或者catch中的返回值是普通变量时。

public class Solution {public static int show() {int result = 0;try {return result;}finally{System.out.println("finally模块被执行");result = 1;}}public static void main(String args[]) {System.out.println(show());}
}

在这里插入图片描述
并不会改变返回的内容。 当返回的变量的类型是引用类型时,结果也是一样的 代码如下:

public class Solution {public static Object show() {Object obj = new Object();try {return obj;}finally{System.out.println("finally模块被执行");obj = null;}}public static void main(String args[]) {System.out.println(show());}
}

在这里插入图片描述
我们可以得出以下结论: 如果try和catch的return是一个变量时且函数的是从其中一个返回时,后面finally中语句即使有对返回的变量进行赋值的操作时,也不会影响返回的值。

结论

1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

http://www.lryc.cn/news/68905.html

相关文章:

  • 美团前高级测试工程师教你如何使用web自动化测试
  • MySql.Data.dll 因版本问题造成报错的处理
  • 囚徒困境——从博弈论的角度解释“美女配丑男”
  • 运算符重载函数作为类的成员函数——有理数的约分
  • mysql数据库的内置函数--7
  • DS3800HPIB 有效执行任务的所有程序
  • 图像比对、人像比对和人脸识别的区别是什么?
  • python中的抽象基类
  • 耗时几个月,终于决定把原本想用于商业的系统开源了
  • HarmonyOS应用端云一体化开发主要流程
  • NoSQL之 Redis配置与优化
  • Redis哨兵模式
  • 数据库管理-第七十六期 如何升级19c RAC(20230516)
  • 组合预测模型 | ARIMA-CNN-LSTM时间序列预测(Python)
  • 实验四 面向对象分析与设计——UML类图与时序图
  • 最短路径问题
  • 国内有哪些SAAS软件?SAAS软件有哪些优点?
  • 分享两组不同的3D VR卡片
  • 外贸人如何精准开发客户?Facebook开发客户全攻略
  • 一、Git安装(Git+TortoiseGit图形化)
  • mysql死锁,如何产生?如何发现?如何处理?
  • YOLO V1-V3 简单介绍
  • 数据结构总结1:了解数据结构、时间复杂度、空间复杂度
  • abstract class和interface有什么区别?
  • Kafka在Java项目中的应用
  • 理解分布式id生成算法SnowFlake
  • 光纤收发器可以连接光模块吗?
  • 一文快速了解浏览器Sui Explorer
  • python中lambda、yield、map、filter、reduce的使用
  • 第十八章 使用LNMP架构部署动态网站环境