finally块中包含return语句对返回值的影响

保姆级教程:用K210麦克风阵列模实现声源定位(附完整Python代码与坐标计算) 本教程详细介绍了如何使用K210麦克风阵列模实现高精度声源定位,包括硬件连接、算法解析与实战代码。通过Python代码示例,展示了从原始数据获取到三维空间坐标计算的完整流程,适用于智能家居、机器人导航等场景。 阅读详情

要想弄清楚这个问题,最好是从字节码指令的层次进行分析,我们以如下代码段进行举例:

public int test() {
        int i=0;
        try {
            i = 1;
            return i;
        } finally {
            i = 2;
            return i;
        }
    }

利用javap工具可获得如下字节码指令:
finally块中包含return语句
若将finally块中的return语句去掉,即代码如下:

public int test() {
        int i=0;
        try {
            i = 1;
            return i;
        } finally {
            i = 2;
            //return i;
        }
    }

则对应的字节码指令如下所示:
finally块中不包含return语句
由此可以看出:如果finally块中不包含return语句,则在进入finally块之前,会将try块中要return的值存储到局部变量表中的另外一个Slot中
4:iload_1 //将局部变量表中的i的值(此时为1)送入操作数栈中
5:istore_3 //将操作数栈中的i值(此时为1)送入局部变量表中的Slot3位置,进行保护
6:iconst_2
7:istore_1 //6,7两步相当于执行finally块中的 i = 2, 此时局部变量表中i的值变为2
8:iload_3 //将slot3中存储的值(此时仍为1)重新送回操作数栈中,以便return
9: ireturn //将操作数栈栈顶的元素返回,即返回的是1
由于有上面第5步和第8步的存在,对try块中要返回的值进行了保护,因此在finally块中改变i的值,并不会影响最终的返回值

注意:上面所说的只是针对i是基本类型变量而言,若i为引用类型,则在finally块中改变i的内部状态,则返回值依然会发生变化。

如果finally块中包含return语句,则不会对try块中要返回的值进行保护,而是直接跳到finally语句中执行,并最后在finally语句中返回,因此返回值是在finally块中改变之后的值
4: goto 8 //不进行保护,而是直接跳到finally块中
……
8:iconst_2
9:istore_1 //8,9两步相当于执行finally块中的 i = 2, 此时局部变量表中i的值变为2
10:iload_1 //将局部变量表中i的值(此时为2)放入操作数栈中
11:ireturn //将操作数栈中栈顶的值(此时为2)进行返回

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

您的关注是我不断创作的动力源泉!期待认识更多的朋友,一起交流Java相关技术栈,共同进步!阅读更多技术文章,可关注我的公众号:codecrazy4j
这里写图片描述

开发基于GDL235KBQ6开发板的IAP升级程序(HEX协议+串口空闲中断 + DMA接收数据) 使用GDL235kB开发板,实现串口iap升级程序的bootloader代码编写,app为led灯闪烁,并完成通信c代码 阅读详情

相关推荐

Odoo 集成ReportBro报表设计器支持13,14,15,16,17,18,19

Odoo 集成ReportBro零代码报表设计器,ReportBro设计器 一个用于创建PDF和XLSX报告模板的javascript插件。

zxltwins的博客 3321

java异常处理:finally中不要return

publicclassEx1{publicstaticvoidmain(String[]args){System.out.println(Ex1.getResult());}publicstaticintgetResult(){inta=100;try{...

aoluan2964的博客 210

你以为你懂 Java 反射?看了这篇源码分析,我发现我以前都错了

摘要:本文讲述了一次生产环境Metaspace内存溢出的故障排查经历。事故源于一个通用数据导出功能中频繁使用反射调用method.invoke(),触发了JVM的"膨胀机制":当同一Method对象调用超过15次时,JVM会动态生成GeneratedMethodAccessor类,导致Metaspace被撑爆。文章分析了问题根源在于循环中反复调用getMethods()创建新Method对象,并提出了三种解决方案:缓存Method对象、改用MapStruct/MethodHandle工具

BUG猿的博客 742

finally语句中不使用return

finally语句中使用return会导致以下两种异常情况出现: 一、会覆盖try或catch的return语句 public class MyTest { public int test() throws ArrayIndexOutOfBoundsException{ try { int a[] = new int[2]; System.out.println("try");

weixin_43902408的博客 1866

returnfinally执行对返回值影响的大论战

returnfinally执行对返回值大论战综述情形1:改变返回值变量指向的位置情形2:改变返回值变量指向位置的内容后记 综述 return:用于跳出当前方法,指向返回值指针(指针、指针、指针…)。 finally:一定会执行。通常用于关闭资源。 函数返回的步骤: 先记录return指针位置,即此时返回值指针位置。 然后执行finally语句, 然后返回return的指针位置。(至此函数执行结束) 所以return指针位置已固定,是不可改变的事实,一切能改变return指针位置所指向的内容的行为均可改变

michael_linux的博客,一个小小小学生。滴水穿石,步步为营,只为那刹那芳华。 1941

JAVA】当finally遇上return

finally遇上return 刚学异常捕获机制时,会有这么一个问题,当try中出现return语句时,那么finally语句还会不会执行呢? 先从一道代码题入手,那么该段代码的输出是什么呢? public static int testFinally1() { int i = 0; ...

阳阳的博客 7031

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

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

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

Java异常try里面有returnfinally代码会执行吗?

try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后? 肯定会执行。finally{}的代码只有在try{}包含遇到System.exit(0);之类的导致Java虚拟机直接退出的语句才会不执行。 当程序执行try{}遇到return时,程序会先执行return语句,但并不会立即返回——也就是把retu...

qq_32534441的博客 2650

try-catch-finally return 的执行顺序

异常处理中,try、catch、finally是按顺序执行的。 即,如果try中没有异常,则顺序为try→finally, 如果try中有异常,则顺序为try→catch→finally。 但是当try、catch、finally中加入return之后,就会有几种不同的情况出现,下面分别来说明一下。也可以跳到最后直接看总结。 一、try中带有return private int testReturn1() { int i = 1; try { i++;

weixin_45122172的博客 1万+

Java finally语句到底是在return之前还是之后执行?

网上有很多人探讨Java中异常捕获机制try...catch...finally中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。 (2)在try中有System.exit(0);这样的语句,System.exit(0);是终止J

weishuai528的博客 409

try catch finally语句中含有return语句的执行情况

1 try中有returnfinally中没有return public class Test { public static void main(String[] args) { System.out.println("main :" + test()); } public static int test() { int num = 1; try { Syste

剑飞的博客 693

java返回语句_Javareturn语句

1、return语句的作用:a、返回一个值,这个值可以是任意类型。b、使程序返回到操作系统(即终止程序)2、java中对于一个函数,不论有没有返回值类型,都可以带有return 语句。但是区别在于,return 语句是否可以返回一个值(这取决与该函数的返回值类型)。a、如果函数有返回值类型(即返回值类型不为void ),则必须带有返回相应类型值的return 语句。b、如果函数没有返回值(即返回值...

weixin_34071707的博客 3305

try、catch和finally中都有return语句的情况

测试代码: public static int WithException(){ int i=10; try{ System.out.println("i in try block is : "+i); i = i/0; return --i; } catch(Exception e){ System.out.println("i in catch - form try block is : "+i); --i; System.out.println("i in catch

Jocab_jl的博客 2061

Finally关键字和return的研究

今天在帮朋友整理面试总结的时候,遇到一个关于Finally关键字和return的问题,所有我研究了一下:

LWF2017的博客 411

finally中不要写return语句

如果finallyreturn语句,永远返回finally中的结果,避免该情况. 正常情况 package cn.itcast.test; public class TryTest8 { public static void main(String[] args) { int value = show(0); System.out.println("value = " + value); } public static int show(int

zhansan的博客 584

try finallyreturn count++等情况下,返回值的理解

前言 首先有如下代码: package hpsyche.string; /** * @author Hpsyche */ public class MyTest { static Integer count=10; static Integer method(){ return count++; } public static void mai...

Hpsyche的博客 838

每天一题(2)-finallyreturn

package com.ydfind.daily; /** * 输出结果是 * A 10 * B 32 * C 33----- * D 35 */ public class TryFinally { public static void main(String args[]){ int num = 10; System.out.println(...

DRD 401

Java:try里有returnfinally还执行吗?

try catch finallyJava中为了防止出现错误导致功能无法使的常见用法。当 try 部分的代码出错,就会去执行 catch 部分的代码。同时往往还会做一个总结性的操作即 finally 中的代码。但是有一个容易出错的问题:当 try 里有 return 语句finally 部分的代码还会执行吗?先说结论:当 try 里有 return 语句finally 部分的代码还会执行,并且 finally 的执行早于 try 里面的 return

qq_46119575的博客 2109

Java】try-finally结构中,try中有returnfinally会怎么样?

void函数 public class Practice { public static void main(String[] args) { testMe(); } public static void testMe() { try { System.out.println("try"); return ; /*编译器会警示说void返回值的函数不需要return

LuYio的博客 404

finally in java,Finally and Return in Java

public class FinallyTest {public static void main(String[] args) {System.out.println("getValue()返回值为:" + getValue());}public static int getValue() {try {return 0;} finally {return 1;}}}3、下面语句的执行结果是:pu...

weixin_34945060的博客 92

java finally return_Java finally return返回分析

网上有很多人探讨Java中异常捕获机制try…catch…finally中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的:(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。(2...

weixin_30910583的博客 345

Java - try、catch、finally包含 return

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

702

anaconda安装包cudatoolkit-11.3.1+cudnn8.2.1

压缩包文件数:3个conda文件2个,一个txt说明文件文件后缀:.conda适合系统:windows x64使用注意:必须安装anaconda3环境且anaconda3为x64版本安装方式:输入下面命令即可自动安装cuda和cudnn到对应虚拟环境首先切换到conda文件路径下面,然后执行conda install cudatoolkit-11.3.1-h59b6b97_2.condaconda install cudnn-8.2.1-cuda11.3_0.conda

《机器学习与模式识别(prml)》PPT课件

prml的课件整合版,不是出自同一学校。大部分章节的PPT是英文版,但由于英文版不全,所以有几个章节挑选了其他学校的中文版作为补充。基本上能够跟prml的内容能够对应。

上一篇: java线程同步举例
下一篇: 字符串全组合与全排列
奔跑吧小蜗牛
博客等级 码龄15年 29粉丝 76原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值