java return与finally执行顺序测试

Keil MDK v6迁移指南:从AC5到AC6的编译器升级与工程适配 编译器是嵌入式开发的底层基石,决定了代码的执行效率与工程的可维护性。随着ARM工具链向LLVM/Clang架构演进,Arm Compiler 6(AC6)正逐步取代经典的AC5,成为Keil MDK的核心编译引擎。AC6在C11标准支持、代码优化、诊断信息及LTO链接优化上全面超越AC5,但迁移过程中往往伴随内联汇编重写、类型检查严格化、库兼容性等问题。理解编译器差异、掌握CMSIS-Toolbox的工程描述机制,能帮助嵌入式工程师在Cortex-M系列项目中平滑过渡。本文结合Cortex-M4量产工程实战 阅读详情

       今天面试一家公司,笔试题目有一道是考察finally块与return的执行顺序,由于以前没去关注,这次又正好遇见,所以做一次记录。

先看代码:

public class Test2 {
	private static int i = 0;
	public static int finallyTest(){
		try{
			System.out.println("enter try block");
			i += 1;
			return i;
		}finally{
			System.out.println("enter finally block");
			i += 1;
			//return i;
		}
	}
	
	public static void main(String[] args) {
		System.out.println(finallyTest());
		System.out.println(i);
	}
}

输出结果为:

enter try block
enter finally block
1
2

可能有部分同学可能认为会返回2,2,可以理解,但是如果你看到这个结果就产生了finally块的代码无法影响try块的返回值的想法,那就又错了(比较简单的情况,在finally里加上return语句,就会覆盖try里的return,但是不推荐这么做,因为这与finally的设计初衷背道而驰),我们再看下面代码:

public class Test2 {
	private static Integer i = new Integer(0);
	public static Integer finallyTest() throws IllegalArgumentException, IllegalAccessException{
		try{
			System.out.println("enter try block");
			i += 1;
			return i;
		}finally{
			System.out.println("enter finally block");
			Class<Integer> clazz = (Class<Integer>) i.getClass();
			Field[] fields = clazz.getDeclaredFields();
			Field f = null;
			for(int i = 0;i < fields.length;i++){
				if("value".equals(fields[i].getName()))
					f = fields[i];
			}
			f.setAccessible(true);
			f.setInt(i, 2);
		}
	}
	
	public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
		System.out.println(finallyTest());
		System.out.println(i);
	}
}

返回结果为:

enter try block
enter finally block
2
2

只是把案例1的int类型改为了Integer类型,就产生了完全不同的结果

下面对着两种结果做解释:

1、如果try块里执行到return语句,首先会把return后面的语句执行,并把结果(实则是一个指针)缓存,但是不会立即返回,会先去检测有没有finally块,如果有,则执行finally块,然后再把缓存的指针的返回

2、严格意义上,finally块的确没法影响try块里的返回值(这里的返回值指的是指针),但是可以改变指针指向的对象

3、有了上面的理解,我们再回头看上面两个案例,对于1,当i设为int类型时,try遇到return语句,此时i的值为1,以下为个人理解:此时会把i的值的内存地址缓存起来,由于i的类型为基本类型,所以会在常量池中分配空间,也就是说此时缓存的结果为一个指向常量池中保存1的内存空间的地址,假设为0x01;接着执行finally块,finally块对i执行了++操作,此时会直接操作0x01所指向的内存里的值吗?当然不会,常量池的值都是不会变的(因为常量池的设计就是为了提高内存利用率),此时只会再在常量池开辟一片空间,用来存储i+=1后的值,也就是2,然后把2的内存地址返回给i,假设为0x02。最后返回缓存的0x01,此时0x01仍指向常量池中的“1”,而不是“2”;如果理解了案例1,再来看2就容易多了,首先,案例2中i的类型是Integer类型,也就是说i是指向一个堆里对象的地址,当执行到try块里的return语句时,i指向堆里对象的值为1,假设地址为0x01,也就是把0x01缓存起来(如果finally里没有return语句,那么这个地址就是返回值),然后执行finally块的代码,finally块操作的i仍指向堆里的同一对象,此时对i进行++操作,不会另外开辟空间,直接对堆里面的Integer对象的value域进行+1操作,所以改变的就是0x01所指向的对象,然后返回缓存的0x01,此时自然变为了2

 

总结:

java语言摒弃了C语言以及C++中指针的概念,无疑简化了我们的开发,但是同时也大大提高我们理解内存存储的难度,总之有利有弊吧。对于本期讨论的主题,总结如下:如果try块里返回值为基本类型(包括String),则finally里影响不到try块里的返回值,但是如果try块里返回的是引用类型,那么finally块是完全有可能影响返回结果的

172、摄像头振动与异响分析:VCM 共振、OIS 机械噪声的用户体验改善 摘要: 本文深入探讨了手机摄像头模组中VCM(音圈马达)与OIS(光学防抖)系统产生的振动异响问题及其解决方案。通过实际案例,分析了VCM弹簧片共振、OIS悬丝机械噪声以及系统级共振的成因,提出了硬件改进(如弹簧片厚度调整、阻尼材料应用)、驱动优化(PWM频率微调、软启动配置)和算法避让等综合解决策略。特别强调了量产阶段隐蔽性问题的排查技巧,包括扫频测试、机械阻尼处理和用户体验优化方法(如频率掩蔽)。作者建议工程师避免过度依赖仿真数据,重视实物测试,并与声学团队协作,以解决这类"玄学"问题,提升用户感知体验 阅读详情

相关推荐

livebos报表开发

文章目录1.参数的设定2.展示的内容3.综合展示的效果4.调用过程5.可以在数据库里面查看6.注意事项7.过程代码 1.参数的设定 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-flb5C49A-1619516341977)(/uploads/xinxibuneibuzhishiku/images/m_bc71bb4608053778dbf29e06cd102ae1_r.png)] 2.展示的内容 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-

阿浪的专栏 710

finally 和 return 的执行顺序

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

龚小帅的博客 1645

信号系统核心概念:卷积、傅里叶变换与抽样定理的工程实践指南

信号与系统是理解现代电子、通信与数字处理技术的基石。其核心在于通过数学工具对物理世界进行建模与分析,其中卷积运算揭示了线性时不变系统对任意输入的响应可分解为冲激响应的叠加,这一原理极大提升了系统测试与分析的效率。而傅里叶变换则提供了从时域到频域的映射,将复杂的时域卷积运算转化为频域的简单乘法,是实现频谱分析、滤波设计的关键。抽样定理则架起了模拟与数字世界的桥梁,明确了无失真数字化的条件。这些基础理论共同构成了滤波器设计、音频处理、图像分析及通信系统等广泛工程应用的技术支柱。本文聚焦于卷积与傅里叶变换,结合冲

weixin_30788619的博客 629

Java中finally和return的执行顺序

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

tracy的博客 3331

Livox MID-360与FAST-LIO2实战:从驱动部署到参数调优的完整指南

激光雷达惯性里程计(LIO)是机器人定位与建图(SLAM)领域的核心技术,它通过紧耦合融合激光雷达点云与惯性测量单元(IMU)数据,实现高精度、低漂移的位姿估计。其核心原理在于利用IMU的高频数据预测运动,并用激光雷达的精确测距信息进行校正与优化,从而在快速运动或特征缺失场景下保持鲁棒性。这项技术的工程价值在于为自动驾驶、移动机器人及三维重建提供了可靠的前端里程计解决方案。针对Livox MID-360固态雷达与FAST-LIO2这一热门组合,其应用场景广泛覆盖了室内外导航与地图构建。本文聚焦于**驱动部署

weixin_29997523的博客 447

昆仑通态,自由串口通讯

软件默认无该功能,需要问客服索要扩展包。

cfqq1989的博客 1544

return在finally前执行还是后执行?

如果在finally前面有return,那么也会先把finally中的代码执行完,再执行return,所以。当程序执行到return的时候,会结束这个方法,并且会把return后面的值,返回到方法调用的地方。finally是用在异常处理中,放在catch之后,finally中的代码是一定会执行的。

weixin_52222660的博客 1630

【2025年华为秋招(AI)-11月19日-第二题(200分)- 终端款型聚类识别】(题目+思路+Java&C++&Python解析+在线测试)

该摘要总结了题目要求、输入输出格式、KMeans算法的实现步骤以及关键点。以下是150字内的摘要: 本文提出基于KMeans算法对终端型号进行聚类的方法。通过包间隔时长、连接持续时长、漫游前后信号强度4个特征,使用欧氏距离度量相似度。算法采用固定初始化策略(前k个样本作为初始质心),经过分配-更新迭代,直至质心移动小于1e-8或达到最大迭代次数。最终输出各簇样本数并按升序排列,解决了终端型号自动分类问题。示例显示该方法能有效识别3-4类终端,并准确统计每类数量。

m0_73659489的博客 141

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万+

【Unity】【Pico】【VR开发】为何PICO打包后真机运行闪退

由于并没有开版权验证,而且闪退后也并没有弹框说版权问题,所以还是怀疑环境有什么地方不对。设置步骤,项目配置都没问题,Build也成功,Unity版本是符合要求的2022LTS版本,但是一在真机上运行就闪退。

每日出拳老爷子的博客 3176

【CASS精品教程】035:南方CASS7.1台阶画法案例大全

摘要:本文详细介绍了南方CASS7.1软件中5种台阶工具的使用方法,包括普通台阶、有边台阶、L型台阶、U型台阶和不规则台阶。重点说明各类台阶的绘制步骤和注意事项,如绘制方向(从右下角逆时针连接4个点)、台阶方向标识(白色边为下边)、台阶数自动生成不可更改等特性。同时指出高版本CASS可能存在操作差异,并配以多张示意图直观展示各类台阶的绘制过程和效果,为使用CASS7.1绘制建筑台阶提供了实用指导。(148字)

智慧空间实验室 2925

Java - try、catch、finally 中 return 语句的执行顺序测试

Java 中 try、catch、finally 中 return 语句的执行顺序测试

业精于勤荒于嬉 130

OpenGL 进阶系列10 - 光线跟踪实现简介(Ray Tracing)

OpenGL 实现光线跟踪(Ray Tracing)是一个相对复杂但有趣的挑战,通常用于生成高度逼真的图像效果,如反射、折射、阴影等。OpenGL 本身并不是为光线跟踪设计的,但可以通过结合计算着色器和现代 OpenGL 功能实现光线跟踪。光线跟踪的基本思路是从相机(或视点)出发,发射光线并计算这些光线与场景中物体的交点。光线与场景中物体相交的计算。计算交点的光照(基于表面法线、光源位置、材质等)。反射和折射的处理(如果物体是透明或反射的)。

GPU全栈博主 1534

finally 和 return 的次序问题。

从测试的结果来看,好像是先 return 值。而后,再处理 finally 中的代码。public class ReturnFinallyTest {  public static void main(String[] args) {    System.out.println("after return: " + rf());  }   public static String rf(){   

LongAway 的 CyberLog 1049

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

史上最清楚讲解:有return的情况下try catch finally的执行顺序(看完不懂算我输!)

首先,直接说结论:(一定要看举例和测试程序!) 1、不管有木有出现异常,finally块中代码都会执行; 2、当try和catch中有return时,finally仍然会执行; 3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在fina...

qq784515681的博客 500

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java finally不执行_Java中finally一定会执行吗? | 学步园

有关finally会不会一定执行的问题,本来想写篇专门的博客,但是看到网上有人已经写的非常清楚,所以就拿过了给大家参考下!一:finally里的语句一定会执行吗?二:有如下形式的语句Java代码try{return5;}catch(Exceptione){e.printStackTrace();}finally{System.out.println("会执行嘛?");}这样的代码块放在一个...

weixin_30998047的博客 228

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java中finally与return_Java中finally与return的执行顺序解析(代码示例)

本篇文章给大家带来的内容是关于Java中finally与return的执行顺序解析(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。都知道,finally的执行特点1、不管有木有出现异常,finally块中代码都会执行;2、当try和catch中有return时,finally仍然会执行。那么问题来了,执行顺序是怎么样的呢?一个简单的测试类及反编译后的字节码:public...

weixin_36217920的博客 228

java 异常 return_java 的异常处理机制,执行顺序;return在异常中的使用 ;自定义异常类的简单应用...

异常处理2种方法:1.抛 (throws)2.自己处理try/catch/finally1.抛出:向上一级抛出,异常实际没有被解决掉2.try/catch/finally(1)正常执行public classTest1 {public static voidmain(String[] args) {Test1 test1= newTest1();test1.say();}public voidsa...

weixin_31270363的博客 245

finally 和 return语句执行的先后顺序

finally 和 return语句执行的先后顺序 private int beforereturn(){ log.info("beforereturn run"); return 1; } private int testfinally(){ try{ int a=1; } catch (Exception e){ log.info("catch exception");

大树叶 技术专栏 229

finally和return执行顺序

https://blog.youkuaiyun.com/love_java_cc/article/details/52785389 try-catch-finally 在try代码块中return的语句先执行,然后执行finally语句,最后返回return的结果 public class FinallyTest1 { public static void main(String[] args) { System.out.println(test11()); } p

stillczw的博客 405

try{}finally{}

有关于try{}finally{} 不管咋说finally的执行顺序永远在最后 public static void main(String[] args) { MyException03 myException03 = new MyException03(); System.out.println(myException03.testTry()); }...

qq_41813925的博客 2803

关于try-catch异常处理中代码执行顺序

这是用来测试有return,且return在try块、catch块、finally块中都有的情况,每个块中都对变量a加了不同的值,并打印当前代码所在块(我分为了四个部分,分别是try-exception-pre、try-exception-after、catch、finally这四个部分分别对用try块中异常之前的代码、try块中异常之后的代码、catch中的代码、finally中的代码),我通过打印信息和a的最终返回值判断代码执行顺序和return的执行顺序。

qq_41717518的博客 267

Java与C++差异解析

Java和C++的区别详解 C++和JAVA的区别

weixin_43364551的博客 420

java面试知识点:try catch finally 执行顺序

java面试知识点:try catch finally 执行顺序 有return的情况下try catch finally的执行顺序 结论: 不管有没有出现异常,finally块中代码都会执行; 当try和catch中有return时,finally仍然会执行; finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代...

Brave Soul Blog 664

有return的情况下try catch finally的执行顺序总结

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

zhangjikuan的专栏 1087

《Java编程思想》笔记——异常

异常 发现错误的理想时机是在编译阶段 Throwable这个Java类被用来表示任何可以作为异常被抛出的类。Throwable对象可分为两类: Error用来表示编译时和系统错误; Exception是可以被抛出的基本类型。 Java中异常处理的常用结构如下: public static int testFinally() { try { System....

年少的风 90
上一篇: 记一次spring5源码完整编译过程
下一篇: 记一次JDK1.8HashMap resize()方法线程不安全验证
coder_no
博客等级 码龄9年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值