java return与finally执行顺序测试

大模型训练和推理 大模型训练moe是指混合专家(Mixture-of-experts,简称MoE)的,这是一种用于提高大型神经网络性能的技术,它可以将模型的一部分替换为多个专家,每个专家只负责处理一部分输入数据,从而增加模型的参数量和表达能力,同时减少计算量和训练时间。指令可以作为模型的输入的一部分,也可以作为模型的输出的一部分,具体取决于任务的类型。上下文扩展技术的,这是一种用于提高大型语言模型(LLM)对长文本的处理能力的技术,它可以让模型在不增加参数量的情况下,扩展其注意力范围,从而提高模型的语言理解和生成能力。 阅读详情

       今天面试一家公司,笔试题目有一道是考察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块是完全有可能影响返回结果的

绝缘体上硅(SOI) vs 传统硅片:5个关键性能对比及适用场景分析 本文深入对比了绝缘体上硅(SOI)与传统硅片在功耗、速度、隔离性等5个关键性能维度的差异,并分析了各自适用场景。SOI技术凭借其独特的埋氧层结构,在低功耗、高频应用和极端环境下展现出显著优势,特别适合移动设备、汽车电子和航天应用。 阅读详情

相关推荐

5.1 Tessent Atpg系列 第八章 Test Pattern Generation - Verify Test Pattern

为什么要做基于timing的仿真,意义在于可以比较ATPG工具和simulator工具的差异性。因为时序的差异导致不同的结果。首先你需要通过write_patern 这句cmd来写出pattern,默认是parallel 模式,除非你用-serial 指定写出serial, 因为serial 文件非常大,所以你可以使用-sample 开关写出部分pattern即可,工具会根据每一种pattern 类型都会至少保存一只。 另外,你也可以使用-start -end 开关来减少文件大小,但是这样的截取,是不可靠的

ciscomonkey的博客 7766

finally 和 return 的执行顺序

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

龚小帅的博客 1645

ESP32 CAM使用教程(入门级)

串口被占用,可以关闭其他使用到串口的界面;先将手机也连上wifi,然后使用手机浏览器打开这个IP地址,注意手机连接的wifi需要和开发板的wifi一致,也就是程序里自己修改的那个wifi,否则无法打开IP地址;将开发板连接到电脑,点击点击工具→端口,然后选择自己实际接的COM口,不清楚COM口的可以打开电脑设备管理器查看一下,插拔设备看看哪个COM口会刷新就是哪个COM口;安装好esp32库之后,点击工具→开发板→esp32→AI Thinker ESP32-CAM,型号要仔细找找,不要选错了;

qq_34426854的博客 2万+

有return的情况下try catch finally的执行顺序(最有说服力的总结)

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

我只是坚持我的兴趣。 23万+

如何用谷歌插件Apollo.io高效开发客户?手把手教你避开常见坑点

本文详细介绍了如何利用谷歌插件Apollo.io高效开发外贸客户,包括核心功能解析、免费额度最大化利用策略、多插件协同技巧以及常见陷阱规避方法。通过Apollo.io的智能匹配算法和庞大数据库,外贸从业者可以精准锁定目标客户,提升开发效率。

banana的博客 888

视网膜血管分割数据集(DRIVE数据集,STARE数据集,REFUGE数据集,CHASE_DB1数据集,DiaRetDB1数据集)

在医学图像处理领域,视网膜图像分析对于眼部疾病的早期诊断与治疗具有举足轻重的意义。随着人工智能技术的蓬勃发展,尤其是深度学习算法在图像分割任务中的广泛应用,高质量的视网膜图像数据集成为推动该领域研究进展的关键要素。这些数据集不仅是训练和优化算法模型的基石,更是衡量算法性能优劣的重要依据。本文聚焦于视网膜图像分割领域,详细介绍 DRIVE、STARE、REFUGE、CHASE_DB1 以及 DiaRetDB1 这几个具有代表性的数据集。

weixin_43518285的博客 2273

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

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

weixin_52222660的博客 1630

基于HetConv与Dual策略的YOLOv8轻量化设计-CSPHet结构的优化与实现

在计算机视觉中,YOLOv8作为目标检测领域的最新版本,通过引入多种改进来提升检测精度和速度。然而,提升精度和保持实时性能往往需要更多参数与计算量。本文提出一种结合Dual思想与HetConv的新型轻量化结构,称为CSPHet。CSPHet能够在保持YOLOv8检测精度的基础上有效减少约70万参数量,实现模型的轻量化和速度的提升。HetConv(Heterogeneous Convolution)是一种混合卷积技术,通过同时使用1x1、3x3等不同大小的卷积核,来捕捉不同尺度的特征。

博客 1328

Java中finally和return的执行顺序

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

tracy的博客 3336

YOLOv13添加DRB模块map暴涨12.33!准确率提升8.56!召回率提升15.66

本文介绍了在YOLOv13模型中添加DRB模块的改进方法。实验结果显示,添加DRB模块后模型性能显著提升,mAP暴涨12.33%,准确率提升8.56%。文章详细说明了移植过程,包括创建yolov13-DRB.yaml配置文件、修改tasks.py和__init__.py文件,以及引入UniRepLKNet模块的具体实现。其中重点描述了GRNwithNHWC、NCHWtoNHWC等核心组件的实现细节,并提供了完整的模型结构配置代码。这些改进使得YOLOv13模型在保持原有架构优势的同时,获得了更强大的特征提取

FJN110的博客 2822

179、瑞芯微RK3588在边缘盒子中的多摄同步架构——基于PLL的帧同步与曝光同步的实测调优

第一,RK3588的多摄同步,硬件上确实支持,但软件配置的坑比想象的多。第三,传感器的tPD差异是最大的不确定因素,选型时尽量选同一批次,而且要在量产前做全温测试——我遇到过低温下tPD变化超过3微秒的情况,直接导致同步失效。我遇到过一批IMX415,tPD差异达到±8微秒,直接超出SYNC控制器的补偿范围,最后只能挑芯片,把差异小的装到同一台设备里。别用100MHz,虽然分辨率更高,但高频信号在PCB走线上更容易引入EMI,边缘盒子的结构件往往没有很好的屏蔽,实测100MHz下同步信号边沿抖动明显增大。

zzfmlxs的博客 40

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

ROS入门教程(四)—— URDF文件与导出

本文将介绍如何在ROS中描述我们的机器人。

吾门的博客 8187

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

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

业精于勤荒于嬉 130

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

qq784515681的博客 500

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

weixin_30998047的博客 228

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
上一篇: 记一次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、付费专栏及课程。

余额充值