finally和return的执行顺序

AUTOSAR—TM模块介绍及使用概要 根据所要测量的场景不同,有1us16bit、1us24bit、1us32bit、100us32bit四种类型可选;TM模块在服务层,提供一些基于时间的服务功能,如测量CPU和任务的负载,周期执行一些回调函数。2、对于需要在不同时间执行不同逻辑的周期任务中,可以搭建时间状态机:参考Tm用户手册;定时器复位、获取时间宽度、定时器转换、定时器同步、繁忙等待。偏移定时器实例的参考时间,直接将定时器数值进行偏移;以1us16bit定时器类型为例,讲几个常用函数。同步两个定时器,把源定时器时间值给到目的定时器。 阅读详情

部分demo代码来自https://blog.youkuaiyun.com/jdfk423/article/details/80406297#commentsedit

私以为原文结论不太准确,也不太完善,以下是个人见解。

问题1:try和catch中有return时,finally里面的语句会被执行吗

(1) 执行try中的return时

public class TryDemo {
    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 TryDemo {
    public static int show() {
        try {
            int a = 8/0;
            return 1;  // 这里因为异常发生,此行代码不会被执行
        }catch (Exception e) {
            // 从结果上看,这行代码被执行了,那么是它先执行,还是finally先执行呢?结论看问题2
            return 2; 
        }finally{
            System.out.println("finally模块被执行");
        }
    }
    public static void main(String args[]) {
        System.out.println(show());
    }
}

其结果如下:

这里写图片描述

我们可以得出结论:

结论1:如果程序是从try代码块或者catch代码块中返回时,finally中的代码总会执行。

引申:finally代码什么时候不会被执行?

答案:

1.如果try语句或者catch语句里存在强制退出语句System.exit(0),代表虚拟机被终止。

2.在执行try...catch语句前已经有了return语句返回,后面的程序不再被执行。


问题2:try代码块或者catch代码块中的return语句  和 finally中的代码谁先被执行?

demo1 返回值是基本数据类型

public class TryDemo {
    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());
    }
}

demo2 返回值是引用数据类型

public class TryDemo {
    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());
    }
}


结果分别如下

这里写图片描述这里写图片描述

我们可以得出结论:

结论2:try代码块或者catch代码块中的return语句 优先于finally中的代码块执行,且函数真正返回之前,finally中的代码块执行必须先执行,所以可以这样说,finally语句在return语句执行之后return返回之前执行的。

到这里还没有结束,需要注意:虽然finally中的语句(非return语句)不会影响最终返回值,但它对返回值的修改其实是生效了的,demo1中因为是基本数据类型,所以看不出来,demo2中返回值是new Object这个对象的地址引用,它并没有被修改,修改的只是obj这个局部变量的指向,原先的对象本身并没有发生改变,所以说demo2其实不太ok。

这里我先贴出一个结论,结论来自于下文中我推荐的博客:

总结:对于finally块中没有return语句的情况,方法在返回之前会先将返回值保存在局部变量表中的某个slot中,然后执行finally块中的语句,之后再将保存在局部变量表中某个slot中的数据放入操作数栈的栈顶并进行返回,因此对于基本数据类型而言,若在finally块中改变其值,并不会影响最后return的值,而若是引用数据类型,改变对象的内容信息是会作用到最后的返回值上的(因为返回值实际并不是对象本身,而是其引用)。
而对于finally块中包含了return语句的情况,则在try块中的return执行之后返回之前,会先goto到finally块中,而在goto之前并不会对try块中要返回的值进行保护,而是直接去执行finally块中的语句,并最终执行finally块中的return语句并直接返回,而忽略try块中的return语句的返回,因此最终返回的值是在finally块中改变之后的值。

demo3

public class TryDemo {

	public static People show() {
		People p = new People(18);
		try {
			return p;
		} finally {
			System.out.println("finally模块被执行");
			p.setAge(20);
		}
	}

	public static void main(String args[]) {
		System.out.println(show().getAge());
	}
}

class People {
	private int age;
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public People(int age) {
		super();
		this.age = age;
	}

}

结果如图:


问题3:如果finally中也有return的时候,finally块中包含的return语句对返回值会有怎样的影响

public class TryDemo {
    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有返回值时,会选择返回finally语句中的返回值,不会再去返回try或者catch中的返回值。另外我通过debug发现,try或者catch语句中的return语句还是有被执行的,但是在最终选择返回值时,选择了执行finally语句中的。

对于问题2和问题3的进一步深入学习了解,对于以上几个demo更好的解释我推荐这篇博文,从字节码指令层次分析https://blog.youkuaiyun.com/abinge317/article/details/52253768

【YOLOv11改进- 主干网络】YOLOv11+RepViT: 从ViT的角度重新审视Mobile的CNN助力YOLOv11有效涨点; 本文给大家带来的改进内容是在YOLOv11中更换主干网络为RepViT,助力YOLOv11有效涨点,论文通过集成轻量级 ViT 的高效架构设计,逐步增强了标准轻量级 CNN(即 MobileNetV3)的移动友好性。这最终产生了一个新的纯轻量级 CNN 系列的主干网络。 阅读详情

相关推荐

基于IMU的纯惯性导航轨迹绘制实践与优化

本文深入探讨了基于IMU的纯惯性导航轨迹绘制实践。通过修改开源组合导航算法KF-GINS,屏蔽GPS更新并简化地球参数,实现了仅依赖IMU数据的轨迹解算。文章详细介绍了代码改造、轨迹可视化方法,并分析了误差累积的根本原因,为深入理解惯性导航原理与传感器融合的必要性提供了宝贵的实践经验。

ff678的博客 399

finally语句与return语句详解

文章目录1.return语句执行顺序1.1finally语句是在return语句执行之后,return语句返回之前执行的2.覆盖问题2.1finally块中的return语句会覆盖try块的return返回2.2如果finally语句没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也有可能不变3.异常情况3.1try块中的return语句在异常的情况下不会被执行3.2try中发生异常时,return写在catch语句中4.finally语句一定会被执行吗? 1.retur

qq_46804966的博客 9551

抖音风控参数逆向实战:从bd-ticket-guard-client-data到x-tt-session-dtrait的完整攻防解析

本文深入解析抖音风控参数逆向实战,重点剖析bd-ticket-guard-client-data和x-tt-session-dtrait的生成机制与破解方法。通过抓包调试、ECDH密钥生成、RSA与AES双层加密等技术手段,揭示抖音风控系统的核心逻辑,并提供实用的对抗策略与维护建议,助力开发者突破抖音风控限制。

weixin_30335575的博客 679

finally与return总结

如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。如果return的数据是基本数据类型,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。

weixin_59640333的博客 2142

晟矽微MC32F7361定时器的使用案例说明

110所以TIMER0所用的频率是FCPU的1/64,也就是8/64MHZ. 为1/8MHZ。//io口下拉电阻 1:enable 0:disablea。//io口上拉电阻 1:enable 0:disable。//io口下拉电阻 1:enable 0:disable。//io口上拉电阻 1:enable 0:disable。//io口下拉电阻 1:enable 0:disable。//io口上拉电阻 1:enable 0:disable。

liyanfei123456的博客 1134

GAN网络详解析

介绍目前常见的GAN网络,以及GAN网络的基本组成

wm199的博客 6507

Java中finally与return的执行顺序

在Java的异常处理中,try、catch 和 finally 是按顺序执行的。如果 try 中没有异常,则顺序为 try→finally,如果 try 中有异常,则顺序为 try→catch→finally。但是当 try、catch、finally 中加入 return 之后,return 和 finally 的执行顺序让很多人混淆不清。下面来分别说明一下。 1. try 和 catch 中带有return 1)try 中带有 return public class tryDemo { ...

骏马逸动,心随你动的博客 8643

infercnv的实操

摘要: 博主在infercnv分析中遇到执行困难,外包服务不可靠(未按要求使用HMM方法)。通过优化策略(逐样本处理、精简细胞至1000个、固定随机种子)解决了运行问题,但HMM功能仍无法实现。最终参考Cell期刊标准设置阈值完成分析,后续将继续更新进展。该案例凸显了生物信息分析中自主优化的重要性。(150字)

xiaoyusang的博客 310

finally 和 return 的执行顺序

代码一: 运行结果如下: 从上述运行结果来看,在执行到之前先运行了代码,为什么会是这样的呢?我们可以看看编译后的代码如下: 发现编译后 被优化了放到了后面,中间都是用临时变量存储的,所以自然而然执行顺序就是先输出然后执行。同时也是表示这个方法运行完准备退出。 代码二: 运行结果如下: 为什么是这样的输出结果,我们查看编译后的代码如下所示: 还是因为代码自动优化了。代码三: 运行结果如下所示: 看完运行结果我们看看编译后的代码如下所示: 从这里可以看出只要在中加了代码结束符,其他地方的都忽略,在中加就相当于

龚小帅的博客 1645

扫地机器人设计与实现——基于嵌入式系统的智能家居解决方案

本文介绍了基于嵌入式技术的扫地机器人设计与实现。通过利用STM32单片机、传感器、驱动系统等硬件组件,并结合路径规划与控制算法、远程控制等软件技术,设计出了一款具有智能避障、路径规划、自动充电等功能的扫地机器人。系统的开发不仅提高了清洁效率,也为进一步研究和优化扫地机器人提供了实践基础。

2201_76125393的博客 1639

从 0 到 1 玩转小智 AI 智能音箱:开发教程 + 实战项目全攻略

如果说 MCP 是工具箱,那 SDK 就是 “技能模板”—— 小智音箱的自定义技能本质是 “意图识别 + 逻辑响应” 的组合,就像给嵌入式设备写驱动程序,只要按规则调用接口,就能实现各种功能。小智 AI 音箱的开发门槛并不高,核心是利用 MCP SDK 封装好的接口,结合嵌入式开发的 “硬件对接 + 逻辑编程” 思维,就能实现各种自定义功能。从环境搭建到技能开发,再到实战项目落地,每一步都是对 “软件控制硬件” 的实践 —— 而这正是嵌入式开发的核心魅力。

weixin_42300449的博客 1194

Java中finally和return的执行顺序

中的内容一定是会被执行的,一般用来释放资源,并确保某些操作一定会执行。是一种针对程序运行时出错的响应手段,对于一些可以预料到的出错类型,在发生时对其进行报告和补救。这就是Java到底是传值还是传址的问题了,简单来说就是:Java中只有传值没有传址,这也是为什么。就变成不可到达语句了,也就是永远不能被执行到,所以需要注释掉否则编译器报错。后的语句中的内容是对应的错误类型。不会被执行到,而是接着执行捕获异常的。语句先执行,确定了返回值后再去执行。中的语句报错了,那么就转入对应的。语句中执行处理异常的措施,

tracy的博客 3336

数字信号处理----数字上变频和下变频都FPGA实现

** 数字信号处理基础----信号下变频和解调 一、 任务介绍 数字上变频器(DUC)和数字下变频器(DDC)广泛应用于通信系统,用于信号采样速率的转换。当信号从基带转换至中频( IF )带,需要使用数字上变频器。而数字下变频器是用于将信号从中频( IF )带转换为基带。DUC和DDC通常包括使用混频器进行频率转换,此外还有采样率转换。DUC或DDC的结构主要取决于所需要的转换率。例如,WiMAX (全球互通微波接入)系统典型的转换率为8—10阶。对于如此低的转换率,DUC和DDC只需采用FIR滤波器架构。

Born_toward的博客 3万+

Java中finally和return执行顺序

总结: 1 finally语句在return语句执行之后return返回之前执行的 2 finally块中的return语句会覆盖try块中的return返回 3 如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变 4 try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况 5 当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全

大灰狼的专栏 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

return 和 finally的执行顺序 ?各位大佬请看过来,

思考题1 : return 和 finally的执行顺序 ? 答: return 先执行 将方法停下,后执行finally ,最后 在执行 return将值返回 例如: public class Return_Finally { public static void main(String[] args) { System.out.println(A.a()); } } class A { public static int a() { int i = 1; try{ re

White_i的博客 2301

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

finally和return的执行顺序,从根本上理解

网上遍布了finally和return的执行顺序问题,也是困扰新手的问题,一堆分析,各种情况。 其实没有必要那么复杂。 finally实际上就是,java在将代码编译成字节码的时候,在所有分支的可能性路径里面都复制了一份finally块里面的代码。如果finanlly里面有renturn,那么 整个字节码里面,有且只会有一个return, 那就是finanlly里面的renturn 看下如下代码,...

hello world 1351

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java中finally与return_java中finally和return的执行顺序

注意:return的位置。。。从这几个例子中可以看到,如果try之前没有有条件的return,则try..catch..finally语句块中的语句都是顺序执行(如果try中或者catch中有return语句,那么先执行该return,然后执行finally, 如果finally中也有return, 该出的返回值会覆盖掉try 和 catch中的return值;如果try..catch..fina...

weixin_39560002的博客 275

Java 中finally和return的执行顺序

前言 在 Java 的异常处理中,try、catch 和 finally 是按顺序执行的。 如果 try 中没有异常,则顺序为 try→finally; 如果 try 中有异常,则顺序为 try→catch→finally。 但是,当 try、catch、finally 中都加入 return 之后,return 和 finally 的执行顺序是咋样的? 注:finally 代码块是一定会被执行的。 我总结为以下几条: 执行 try 代码块或 catch 代码块中的 return 语句之前,都会先执行

weixin_44730681的博客 905

try、catch中finally和return执行顺序

1.执行try中的return public static int show() { try { return 1; } catch (Exception e) { return 2; } finally { System.out.println("finally模块被执行"); } } public static void main(String a

qq_58595750的博客 3770

finally和return执行顺序

java中finally和return执行顺序

weixin_40452750的博客 682

finally和return的执行顺序、结果

1. try和catch中有return时,finally里面的语句会被执行吗 我们可以来分别看看 (1)执行try中的return时 public class tryDemo { public static int show() { try { return 1; }finally{ System.out.println(“finally模块被执行”); } } public static v...

shuang5725的博客 470

return和finally的执行顺序

return执行时,先会将后面的表达是的值,置于返回栈的顶部(此为方法的最终返回值),然后去执行finally的代码 return的最后返回值取决于return后面的表达式的值 此处共涉及三个操作:序号1是return最终的返回操作、序号2是return后面的表达式、序号3是finally的执行,其执行顺序为:序号2>序号1>序号3 示例 public class Test01 {...

来日可期a的博客 523
上一篇: 并发和并行的区别?一个很容易混淆,被忽略的问题
下一篇: Thread构造方法分析
MrMoving
博客等级 码龄10年 54粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值