try-catch-finally 与返回值的修改

try、catch、finally 和 return 的执行关系 finally 块的代码总是会执行,无论 try 块是否有异常,是否有 return,还是程序中抛出了异常。即使 try 或 catch 块中有 return,finally 块也会在 return 之前执行。如果 finally 块中包含 return,它会覆盖 try 或 catch 中的 return 结果,直接返回 finally 的返回值。这些规则保证了 finally 块的执行一致性,但也可能引发一些难以察觉的问题,所以在编写代码时需要特别小心 finally 中的逻辑。 阅读详情

先看一段java代码,func返回值为int:

public static int func() {
    int result = 0;
    try {
        result = 1;
        return result;
    } catch (Exception e) {
        result = 2;
        return result;
    } finally {
        result = 3;
    }
}

正确的返回结果是,func返回1。

原因:

如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况,:

1)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。

2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。

 return 是String类型的code:

    public static String funcStr() {
        String result = "hello";
        try {
            result = "1";
            return result;
        } catch (Exception e) {
            result = "2";
            return result;
        } finally {
            result = "3";
        }
    }

该函数返回值为字符串”1”。

返回值是引用数据类型(对象):

    public static Person funcPerson() {
        Person result = new Person(20);
        try {
            result.age = 30;
            return result;
        } catch (Exception e) {
            result.age = 40;
            return result;
        } finally {
            result.age = 50;
        }
    }

    static class Person {
        public int age;
        public Person(int age) {
            this.age = age;
        }
    }

该函数的返回类型是resultPerson,age为50,即在finally中更改了有效。

总结:

如果没有异常出现,而且finally语句中没有return,则会执行try里边的return,并且,会将变量暂存起来(对象存的是引用的地址),再去执行finally中的语句,这时候,如果返回值是基本数据类型或者字符串,则finally相当于更改副本,不会对暂存值有影响;但是,如果返回值是对象,则finally中的语句,仍会根据地址的副本,改变原对象的值。所以上边的例子,返回值的age为50。

测试代码地址:

https://github.com/YoungBear/InterviewEveryday/blob/master/InterviewExperiment/src/com/interview/inherit/FinallyReturnTest.java

参考:

http://blog.youkuaiyun.com/zhumintao/article/details/53818972

http://blog.youkuaiyun.com/kavensu/article/details/8067850

关于基于Midas Civil API的二次开发——PyMiMi 现在写了第一条博客,希望是一个好的开始,能够每天抽出一两个小时或者更多的时间来写写代码,研究研究。我发现在我的工作中存在着大量的重复性工作,对于文档的开发是好办的,毕竟网上有现成库,只需要pip一下拿来用就好,但是对于Midas而言,在24版本之前官方都是没有一个可以使用的接口的,可能mct文件算半个? 阅读详情

相关推荐

【阿里云大模型高级工程师ACP习题集】2.1 用大模型构建新人答疑机器人

【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!

davidkorhenn的博客 2607

异常处理:try..catch、 异常处理:try..catch...finally、命令行参数的赋值、 final,finalize,finally的区别

异常处理:try…catch 1、语法结构 try{ 可能发生异常的代码 }catch(异常类型1 异常名称){ 捕获到该异常,如何处理的代码 (1)什么也不写 (2)打印异常 (3)其他的处理方法 }catch(异常类型2 异常名称){ 捕获到该异常,如何处理的代码 }catch(异常类型3 异常名称){ 捕获到该异常,如何处理的代码 } … 说明:多个catch有要求,必须是小的在上面,如果没有大小(这里的大小是继承的关系,父类大于子类)随意 2、执行的特点 (1)如果try中的代码没有发生

qq_41005604的博客 569

LLM大模型基础知识【一】

大语言模型(LLM):是指在自然语言处理(Natural Language Processing,NLP)领域中的一类大模型,通常用于处理文本数据和理解自然语言。这类大模型的主要特点是它们在大规模语料库上进行了训练,以学习自然语言的各种语法、语义和语境规则。例如:GPT系列(OpenAI)、Bard(Google)、文心一言(百度)。视觉大模型:是指在计算机视觉(Computer Vision,CV)领域中使用的大模型,通常用于图像处理和分析。

lin_xi_xi的博客 2874

try...catch...finally中的值传递和引用传递的问题

已经将student这个地址的内存中的数据进行了修改,不管你是不是执行完finally后在返回这一套了。传的student是引用传递,传递的是student在内存中的地址,但是因为有。方法返回的还是student在内存中的地址,但是。不管在什么情况下都要被先执行,哪怕你。输出20的原因:因为这里。

何冽冽的博客 411

yolov5深度剖析+源码debug级讲解系列(一) yolov5的架构和源码debug准备

前言 前段时间分析了yolov3的源码,这次想带着小伙伴一起把yolov5完全掌握。博主还是保持着一贯的风格,依旧采用debug级别的源码剖析。目的就是让大家可以通过一个系列的文章就把yolov5的架构、设计理念和每一行源码都弄懂。只要小伙伴可以花时间把这个系列读完,就会对yolov5的理解有所提升。 去年参加了kaggle的小麦检测比赛,yolov5在比赛的中段开始呈现霸榜趋势,超越了efficientdet。虽然最后yolov5因为权限等某些问题被kaggle官方禁用了,但是仍然体现出了其强大的能力。值

人唯优的博客 4万+

STM32F407通过FSMC接口与LAN9252的EtherCAT从站移植实战

本文详细介绍了在STM32F407平台上,通过FSMC接口驱动LAN9252 EtherCAT从站控制器的完整移植实战。内容涵盖硬件连接、FSMC时序配置、官方SDK代码分析与关键修改、EtherCAT协议栈集成适配,以及实战调试与稳定性优化技巧,旨在帮助工程师解决工业通信中的核心挑战,实现稳定高效的实时控制网络接入。

weixin_29268267的博客 274

细琢磨,try catch finally 执行顺序与返回值

try catch finally 常见格式如下: try{ //应用代码 }catch(Exception e){ //异常捕捉处理 }finally{ //资源释放、流关闭等等 } 通常执行顺序: try有异常时,try-catcy-finally try无异常时,try-finally 那么如果有返回值呢?try catch finally 每个部分均有return语句呢...

小小默:进无止境 2324

【STM32】STM32 CANFD外设的几种消息接收过滤模式

在控制器区域网络(CAN)系统中,正确配置消息过滤器对于有效管理网络通信至关重要。特别是在使用Flexible Data-rate Controller Area Network(FDCAN)时,选择合适的过滤器类型可以大大提高网络效率和消息处理速度。

林愿留的博客 6226

java try 返回值_Java返回值(在try / catch子句中)

大家。我有一个关于java中返回值的菜鸟问题。这是我的代码。@Overridepublic long addDrugTreatment(long id, String diagnosis, String drug,float dosage) throws PatientNotFoundExn {try {Patient patient = patientDAO.getPatientByDbId(i...

weixin_36377785的博客 625

从波士顿动力SpotMini拆解看四足机器人机械设计:关节布局与电机选型的5个关键决策点

本文深入解析波士顿动力SpotMini四足机器人的机械设计,聚焦关节布局与电机选型的5个关键决策点。通过拆解髋关节偏移距、膝关节传动链、电机热管理等核心设计,揭示商业级四足机器人的工程智慧,为工业巡检、物流机器人等应用提供实用参考。

postgres8guard的博客 893

CUDA:实现使用cuSolverSP底层API实现Cholesky因式分解(附完整源码)

CUDA:实现使用cuSolverSP底层API实现Cholesky因式分解(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 342

Java语法:finally中修改返回结果

Java的try语句在返回前将其他所有的操作执行完,保留好要返回的值,而后转入执行finally中的语句,而后分为以下三种情况: 如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句。 如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后接着执行try中的return语句。 如果finally中没有return语句,但是改变了要返回的值,分以下两种情况: 1)如果retu

做好自己 1500

2026年数学建模国赛B题无线电干扰源的快速自动定位与清除 论文详细解析

数学建模竞赛论文无线电干扰源的快速自动定位与清除2026 年高教社杯全国大学生数学建模竞赛 B 题完整求解论文交会定位、极大极小测点优化、自适应多频道搜索与定向源恢复的统一建模模型、算法、代码、图表与验证一体化交付本文研究圆形目标区域中多个未知无线电干扰源的快速检测、定位与清除问题,建立了由误差楔交会模型、角度观测信息模型、分层勘测模型、鲁棒射线交会模型和定向覆盖反馈模型组成的统一求解框架。模型同时覆盖题目中的四个子问题:多测向射线形成的多边形定位区域及直径、第二个测点的极大极小优选、全向源自动搜索清除策略

YOLO 357

Java中try catch finally的使用

    在Java中提供了try catch finally结构来进行异常处理。大致执行结构如下try{ //代码执行区域 }catch(Exception e){ //异常处理区域 }finally { //无论如何,都会执行的代码块 }  &nbs...

学习笔记666 354

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

try-catch-finally组合情况、执行过程字节码解读

1.try-catch-finally组合情况 2.执行过程字节码解读 3.finally中对返回值进行修改 4.finally中有返回值 5.finally是否必须执行

FixedStar 的博客 626

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

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

try catch finally 使用方法详解

本文是一个老前辈写的java中的try、catch、finally的用法文章,下面的9个例子,把涵盖的所有用法基本都涵盖了,值得大家细细的观看,很有用。看完也就知道到底该怎么用try、catch了。希望对大家有所帮助。文末有我写的一些用法总结。用好try catch很重要,在处理多线程、避免线程阻塞中很有用,同时养成良好的异常处理习惯,也是作为一个程序员的必备素养。 转载自:http://www....

a116385895的博客 5815

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

关于try...catch...finally中return的疑惑

关于try...catch...finally里面的return一直是面试的一个热门考点。无非就分以下几个情况: 1、当有finally语句并且try中有return,在执行到return(还未执行)的时候,会先执行finally里面的内容,然后再执行行try中的return。 package com.and.java.demo; public class 测试 { public st

And.He 1119

try…catch…finally答疑

try-catch-finally 中哪个部分可以省略? catch 和 finally 语句块可以省略其中一个。但不可以同时省略。 try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? finally是java保证代码一定要被执行的一种机制。这就意味着程序无论正常执行还是发生异常,只要JVM不关闭(System.exit())都能执...

qq_36737982的博客 1350

try,catch,finally执行顺序

在讲述三者顺序之前,先看一个小例子 调用下列方法时,得到的返回值是什么? public int getNum(){ try{ int a=1/0; return 1; }catch(Exception e){ return 2; }finally{ return 3; } } 结果:  返回值是 3 分析:  1.代码在执行到第三行的时候,遇到了MathExcep...

qq_43510714的博客 304

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

Java_try, catch and finally相关解析以及它们与return的爱恨情仇

Java中关于try…catch…finally异常处理的细节辨析 什么时候执行finally; finally后面的语句执行吗; try…catch…finally块中的finally语句是不是一定会被执行; Java中finally与return的执行顺序详解; 首先需要明确几点: + try语句块中的代码应是可能出现异常的代码,可能会抛出一个或多个异常,因此,try后面可跟一个或多个ca

S_gy_Zetrov的博客 1799

try-catch里面加了return后,finally还会执行吗?

请看下面的方法,在我们的catch里面,捕获到了异常之后,我们的catch模块里面的语句,还会接着执行,当我们执行到return之后,我们不会立即返回,而是会接着执行finally块里面的代码,只有执行完,才会继续执行我们的return值, public static Boolean testQQ(){   Boolean f=true;   int a=0;   try{   ...

weixin_30419799的博客 3403

try、catch、finally语句中有return 的各类情况

try、catch、finally语句中有return 的各类情况1、 try-catch-finally中均无return,仅4中有return注意2、try 和 catch 中都带有 return ,finally无return总结 在 Java 的异常处理中,try、catch 和 finally 是按顺序执行的。如果 try 中没有异常,则顺序为 try→finally,如果 try 中有异常,则顺序为 try→catch→finally。但是当 try、catch、finally 中加入 retu

code_java_zqy 2859

Java finally与return执行顺序回顾

}public static String test12() { }} try blockreturn statementfinally blockafter return public class FinallyTest2 { } try blockfinally blockb>25, b = 100200 public class FinallyTest3 { } try blockfinally blockb>25, b = 100100 import java.util.*;public class

2301_82244122的博客 361

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

原文链接:https://mp.weixin.qq.com/s/TFmFL9aFht71bz8cxjgw3g 网上有很多人探讨Java中异常捕获机制try…catch…finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样fina...

XiXavier的博客 184
上一篇: getDimension,getDimensionPixelSize,getDimensionPixelOffset三者的区别
下一篇: Android adb 常用命令
杨小熊的笔记
博客等级 码龄15年 125粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值