try finally中return count++等情况下,返回值的理解

C语言第八课 函数递归 程序调用自身的编程技巧称为递归(就是一个函数自己调用自己) 递归的两个必要条件 1、存在限制条件,当满足这个限制条件的时候,递归不再继续。 2、每次递归调用之后越来越接近这个限制条件。 递归常见错误——stack everflow——栈溢出 练习创建函数求字符串长度 #include<stdio.h> int mystrlen(char* str)//定义函数 { in... 阅读详情

前言

首先有如下代码:

package hpsyche.string;

/**
 * @author Hpsyche
 */
public class MyTest {
    static Integer count=10;
    static Integer method(){
        return count++;
    }
    public static void main(String[] args) {
        System.out.println(method());
    }
}

可以看到输出结果为10,结果合理,先return count,再++;

引入

再看如下例:

public class MyTest {
    static Integer count=10;
    static Integer method(){
        try{
            return count++;
        }finally {
            return count--;
        }
    }
    public static void main(String[] args) {
        System.out.println(method());
    }
}
  • 此代码的执行结果为?

    11。

    按照上例的思考以及对try finally执行顺序的理解:(finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的)。

    即按照我的理解,应该是先将count=10的结果保存起来,再到finally时不管其对count的任何修改,在return时直接返回count=10的结果的,但是输出结果确出人意料,为11?

让我们一探究竟,反编译字节码文件后,如下:

package hpsyche.string;

import java.io.PrintStream;

public class MyTest
{
  static Integer count = Integer.valueOf(10);
  
  static Integer method()
  {
    try
    {
      Integer localInteger1 = count;localInteger2 = MyTest.count = Integer.valueOf(count.intValue() + 1);localInteger1 = localInteger1;
    }
    finally
    {
      Integer localInteger2;
      Integer localInteger3;
      Integer localInteger4 = count;Integer localInteger5 = MyTest.count = Integer.valueOf(count.intValue() - 1);return localInteger4;
    }
  }
  
  public static void main(String[] paramArrayOfString)
  {
    System.out.println(method());
  }
}

其实反编译后的代码将流程写得很清楚,大家仔细看下以上代码。

个人理解:当程序看到finally中存在return时,会将try代码块中的返回值存储起来,由于try与finally中的局部变量localIntegerX不能变量,此时只能将try中count++的结果count赋予localInteger4(由于程序也不知道count到底在try中进行了什么样的变化,最终只能默认在finally中取下count的值),最后返回localInteger4(此时不管finally跑了什么代码,最后返回的都是缓存的count的值)。

所以,我们会看到最后返回值为11,而不是10。

而当finally不return时,即

package hpsyche.string;

/**
 * @author Hpsyche
 */
public class MyTest {
    static Integer count=10;
    static Integer method(){
        try{
            return count++;
        }finally {
            count--;
        }
    }
    public static void main(String[] args) {
        System.out.println(method());
    }
}

运行结果为10,

我们也尝试反编译下:

package hpsyche.string;

import java.io.PrintStream;

public class MyTest
{
  static Integer count = Integer.valueOf(10);
  
  static Integer method()
  {
    Integer localInteger4;
    try
    {
      Integer localInteger1 = count;Integer localInteger2 = MyTest.count = Integer.valueOf(count.intValue() + 1);
      Integer localInteger3;
      return localInteger1;
    }
    finally
    {
      localInteger4 = count;Integer localInteger5 = MyTest.count = Integer.valueOf(count.intValue() - 1);
    }
  }
  
  public static void main(String[] paramArrayOfString)
  {
    System.out.println(method());
  }
}

由于finally中无返回值,缓存了try中的返回结果后执行结果后,直接在try代码块中返回,避免了第一例中try与finally无法共享局部变量的情况,此时即可以准确返回localInteger1的值,即10。

后言

同理,其他情况我们如果发现和自己的想法有所出入时,也可以尝试反编译下代码,确实能够很直观地帮助我们思考与解决问题。

【手把手带你刷LeetCode】——19.水仙花数(作业) 【前言】 今天是力扣打卡第19天! 太忙了,发的有的那晚,抱歉哈,最近笔者作业有点多,也有几题比较好的,所以就整理出来了。 题目:求水仙花数 题目描述: 求出0~100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数,其各位数字的n次方之和正好等于该数本身,如 : 153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个“水仙花数”。 注意哦,正常我们求水仙花数算的是三位数,但是这题不是哦,本题要算到十万。 题解: 题目讲的是一个n位数,其各位数字的n次方之和 阅读详情

相关推荐

用友Java笔试题详解:从基础语法到JVM并发的高频考点

Java笔试中,基础知识的重要性不言而喻。无论是集合框架(如HashMap的扩容与树化)、JVM内存模型,还是并发编程(如volatile的可见性),都是企业考察程序员底层功力的核心点。理解这些概念背后的原理,例如负载因子0.75的权衡、Integer缓存机制、synchronized与ReentrantLock的区别,不仅有助于通过笔试,更能指导实际工程中的代码优化与问题排查。以用友秋招Java笔试题为实例,深入拆解高频考点与易错点,帮助开发者构建系统化的Java知识体系。

weixin_34161083的博客 371

Problem(二):count++ 与 ++count

为什么80%的码农都做不了架构师?>>> ...

weixin_33932129的博客 575

1.1.4 运用防火墙实现入侵防御

摘要:本文详细介绍了某公司网络拓扑中防火墙FW1的配置过程。主要内容包括:1)通过web界面登录防火墙;2)配置三个接口的IP地址及所属安全区域;3)创建两个入侵防御配置文件(anti_untrust和anti_trust);4)配置安全策略untrust2dmz和trust2dmz,分别允许公网/内网访问WWW服务器;5)保存配置。操作步骤配有详细截图说明,涉及接口配置、安全区域划分、入侵防御策略设定等关键环节,最终实现内外网对服务器Server1的安全访问控制。(149字)

Ljs040411的博客 2134

【C语言初阶笔记】深入探索C语言操作符的奥秘(下)!!

目录 操作符和表达式 表达式求值 隐式类型转换 整型提升的意义 如何进行整体提升 算术转换 操作符的属性 运算符优先级和结合性一览表 一些容易出错的优先级问题 一些问题表达式 1.a*b + c*d + e*f 2.c + --c 3.int ret=(++i)+(++i)+(++i) 4.answer = fun() - fun() * fun() 代码示例 1.求两个数二进制中不同位的个数 2.打印整数二进制的奇数位和偶数位 3.统计二进制中1的个数 总结 .

ljp 1699

字符集的选择

字符集的选择 一:背景介绍 DICOM特定字符集(0008,0005) 此标签获得不同的值就代表使用不同的语言进行解码。 以下为多家CT厂商的(0008,0005)取值: 字符集: unicode是字符集,ASCII、GB2312、GBK、GB18030既是字符集也是编码方式,UTF-8只是编码方式。 二:中文字符集介绍 世界通用字符集——UTF 中文字符集——GB2312、GBK、GB18030 字符集的详细介绍 一:UTF-8 程序是把一个字节一个字节的来读取,然后再根据字节中开头的bit

qq_41972968的博客 1520

Microapp 接入vite子应用

MicroApp接入vite版本,干货满满,手把手步骤说明,加上报错说明,赶紧上车!

outsider76557的博客 4660

Linux C编程:打造一个插件系统

好吧,自己把game.c里面的内容改改,然后编译出来,换个名字,然后在missionlist.txt里面加一行,就ok了。每次想加新关卡,都需要重新编译一次,再下载一次,这个流量嘛,1+1.1+1.2+1.3,每次加个0.1,都够你受的。最著名的就数魔兽大脚插件啦,还有vim插件啦,eclipse插件啦,等等。举个例子,你开发了一个游戏,一开始只有三个关卡,分享给了你的小伙伴玩。大家玩得很爽,但很快,游戏通关了,还想玩,这时候怎么办呢?插件,很多人用过,比如游戏插件,编辑器插件这些,

kof98765的专栏 659

GNSS数据处理新手避坑:手把手教你用GAMP_GOOD下载IGS/MGEX数据(附.cfg文件详解)

本文详细介绍了如何使用GAMP_GOOD进行GNSS数据处理,从基础配置到高级参数调优,帮助新手避开常见错误。内容包括软件安装、配置文件详解、数据源选择、测站文件配置以及性能优化技巧,特别适合GNSS数据处理初学者快速上手。

weixin_30338481的博客 390

保姆级教程:用EfficientDet和DLA34在NuScenes上复现CDSM融合(附代码避坑点)

本文提供了一份详细的CDSM(跨域空间匹配)融合实现指南,使用EfficientDet和DLA34在NuScenes数据集上进行多模态传感器融合。从环境搭建、数据预处理到网络架构调整和训练技巧,涵盖了完整的工程实践流程,帮助开发者高效复现论文成果并避开常见陷阱。

weixin_33727510的博客 417

机器人控制入门:用SAC算法让机械臂学会抓取(PyBullet仿真教程)

本文详细介绍了如何使用SAC算法在PyBullet仿真环境中训练机械臂完成抓取任务。通过强化学习中的软Actor-Critic(SAC)算法,结合熵最大化机制和双Q网络架构,有效解决了机械臂控制中的探索难题。教程包含环境搭建、算法原理、状态空间设计、奖励函数优化等核心内容,并提供了实用的训练技巧和参数调优指南。

weixin_29091105的博客 362

【AI智能体】飞书 AI 智能客服机器人搭建与使用实战操作详解

飞书 AI 智能客服机器人搭建与使用实战操作详解

congge 6054

return和finally执行顺序 @

public class Test { public static void main(String[] args) { System.out.print(tt()); } public static int tt() { int b = 23; try { System.out.println("yes"); return b += 88; } cat

316

2026年运维工程师常见面试选择题

这篇文章总结了30道Linux运维面试常见问题及解析,涵盖基础命令、系统监控、故障排查、数据库、缓存、容器编排等多个方面。主要内容包括: 基础命令使用:如df查看磁盘、free查看内存、top监控进程等 系统监控与故障排查:负载判断、端口检查、进程管理等 中间件相关:Nginx状态码、MySQL主从复制、Redis缓存问题 容器技术:Docker优势、Kubernetes作用 运维理念:高可用、监控告警、发布策略、备份容灾 工作原则:故障处理优先级、运维工程师核心能力 文章不仅提供标准答案,还解析了各命令的

不务正业的猿 193

Java技术类选择题复盘:从校招真题看高频考点与知识体系构建

技术类笔试是互联网校招的第一道门槛,Java基础更是其中核心中的核心。很多人刷题只对答案,却忽略了选择题背后隐藏的完整知识网络。本文以一套经典校招真题为线索,从HashMap默认容量为何是16、负载因子为何是0.75,到i++的字节码执行细节,再到volatile与原子性的区别、JVM双亲委派模型原理,逐一拆解高频考点背后的设计思想与底层逻辑。通过三遍复盘法、连环追问法,帮助读者把零散的知识点串联成结构化知识树,既覆盖笔试考察面,也为面试深度追问做好准备。无论你正在准备校招笔试还是想系统夯实Java基础,这

weixin_33938733的博客 299

KEPServerEX 6 之驱动协议(UDD)实战 HTTP协议对接OpenWeatherMap天气 API全流程指南

本文分享了基于 KEPServerEX 6 的通用设备驱动(UDD)对接OpenWeatherMap天气API的实战方案。该方案针对工业物联网场景进行了深度优化,具有动态城市切换、运行时热配置、老旧JS引擎兼容等核心特性。文章详细介绍了从环境准备、脚本部署到Tag配置的全流程,重点解析了Legacy JS语法适配、Float类型安全处理等关键实现细节,并提供了完整的避坑指南和故障排查方法。该方案经过生产环境验证,可稳定实现气象数据采集与动态切换功能,适用于SCADA/MES系统集成场景。

-雲飛兄-博客 714

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

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

C#异常处理实战指南:从try-catch到全局异常处理

异常处理是编程语言中用于应对运行时错误的核心机制,其原理在于通过中断正常执行流并查找匹配的异常处理器来保证程序可控性。在C#开发中,合理的异常处理技术价值在于提升系统健壮性、可维护性和问题排查效率。应用场景广泛覆盖从用户输入验证、资源操作到分布式系统调用等环节。本文聚焦于C#的try-catch-finally结构,深入探讨异常捕获的设计哲学、资源管理的最佳实践以及如何避免常见的异常处理陷阱,帮助开发者构建更可靠的应用程序。

weixin_33690963的博客 356

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

# Python 函数、异常、循环与迭代:从基础语法到执行模型的系统理解

本文以四个Python基础问题为切入点,系统梳理了Python核心编程概念。首先简要回答了关于函数、异常处理、循环和迭代器的基本问题,随后深入探讨了每个概念背后的设计思想和应用场景。重点分析了函数封装的意义、参数系统的设计哲学、异常处理的最佳实践,以及迭代协议的工作原理。文章强调,函数不仅是代码复用工具,更是抽象复杂性的重要手段;参数系统的多样性服务于不同的调用需求;精确的异常处理能提高程序健壮性;而迭代器的惰性取值特性使其适合处理大数据流。这些概念共同构成了Python控制程序执行流程的核心机制。

2302_80293520的博客 546

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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...

Java中i++的原子性问题与并发解决方案

在并发编程中,原子操作是指不可分割的单一操作,能够保证在多线程环境下的数据一致性。Java内存模型(JMM)定义了线程如何与主内存交互,而i++这类看似简单的操作实际上包含读取-修改-写入三个步骤,并非原子操作。这会导致竞态条件问题,影响系统正确性。通过synchronized、AtomicInteger和Lock等同步机制,可以有效解决并发计数问题。其中AtomicInteger基于CAS(比较并交换)原理实现,是无锁算法的重要应用。在高并发场景如电商点击量统计中,合理选择并发控制策略对系统性能至关重要。

weixin_33709609的博客 503

Java高级面试10大高频送命题深度解析:从String到ThreadLocal的底层原理

在Java开发领域,理解核心机制底层原理是区分普通开发者与高级工程师的关键。从内存模型到并发编程,Java语言规范定义了对象创建、方法调用和线程交互的基本规则。这些原理决定了程序的性能、稳定性和可维护性,是构建高并发、高可用系统的技术基石。例如,String常量池机制通过复用不可变对象优化内存使用,而volatile关键字则通过内存屏障保证多线程间的可见性。在实际应用场景中,HashMap的快速失败机制防止了迭代过程中的数据不一致,ThreadLocal的弱引用设计则需要配合remove()调用来避免线程池

weixin_34062469的博客 353

Java高级面试必考:10道高频笔试题深度解析与避坑指南

在Java高级工程师的面试中,对核心原理的深度理解是区分候选人的关键。Java内存模型、并发编程、集合框架等基础概念是构建复杂系统的基石。理解这些原理不仅能提升代码质量,还能有效排查线上问题,其技术价值在于保障高并发场景下的系统稳定性与性能。例如,掌握HashMap的扩容机制与红黑树转换,可以优化数据存取效率;理解synchronized与ReentrantLock的底层差异,有助于设计更精细的线程同步方案。在实际的面试场景与工程实践中,面试官常通过看似基础的笔试题,考察候选人对String常量池、Inte

weixin_30323631的博客 396

德邦Java工程师笔试题复盘:从基础语法到JVM核心考点

Java基础是每一位后端工程师的立身之本,无论是校招笔试还是日常开发,语法细节、集合框架、异常处理与JVM内存模型都决定着你能否写出稳健高效的代码。本文从这些通用技术概念出发,梳理其核心原理与工程价值,并结合实际场景说明它们在数据存储、并发优化、故障排查中的落地应用。同时,我们以一份2017年德邦Java秋招笔试试卷为样本,系统性复盘运算符陷阱、String比较、HashMap扩容、垃圾回收算法、排序手写等高频考点,帮助你快速定位知识盲区。无论你是在准备面试,还是想强化基本功,这套覆盖从基础语法到JVM调优

weixin_34248705的博客 420

Java循环控制:break、continue、return与标签的深度解析与实战应用

在Java编程中,循环控制是程序逻辑的核心组成部分,它决定了代码的执行流程和效率。理解循环控制语句的原理,对于编写高效、健壮的代码至关重要。break、continue和return是Java中三种基本的循环控制机制,它们分别用于终止循环、跳过当前迭代和退出方法。这些机制在嵌套循环、switch语句和Lambda表达式中有着不同的应用场景和行为表现。掌握它们的使用技巧,可以帮助开发者避免常见的逻辑错误,如无限循环和switch穿透,并提升代码的可读性和性能。特别是在处理集合搜索、数据验证和复杂嵌套逻辑时,合

weixin_33785108的博客 301

欢聚时代校招Java基础笔试题B卷详解:考点拆解与避坑指南

Java基础是互联网公司校招笔试的核心筛选维度,其背后考察的不只是语法记忆,更是对集合框架、异常处理、多线程与JVM底层机制的综合理解。从HashMap的数组+链表+红黑树结构,到synchronized的锁升级过程,再到finally块与return的执行顺序,每一个考点都直接映射到日常开发中的数据结构选型与代码健壮性设计。对于准备校招或工作后查漏补缺的开发者而言,通过典型笔试题系统梳理这些基础概念,比零散背诵八股文更有效。这套欢聚时代2017校招Java基础类B卷,正是围绕这些高频易错点展开,覆盖面向对

weixin_34408717的博客 414

Java continue语句的底层原理与工程实践

continue是Java中用于控制循环迭代流程的基础语句,其本质并非简单跳过代码行,而是触发循环体执行上下文的重置与迭代状态的强制刷新。从语言规范看,它严格受限于循环语法边界、作用域嵌套层级及JVM字节码中的goto跳转机制;从技术价值看,它支撑卫语句设计、状态机驱动和资源安全释放等关键工程模式;在实际应用中,常见于订单批量校验、库存扣减、数据同步等高并发业务场景。深入理解continue与for/while循环更新逻辑的耦合关系、嵌套标签的精确制导能力,以及其在finally、lambda、增强for等

weixin_30838873的博客 314

query-json控制流终极指南:OCaml Effect Handlers如何驱动try/catch与break

**query-json** 是一个用 OCaml 实现的类 jq 的 JSON 查询语言,主打更快、更简洁、更便携的 JSON 数据切片与转换。本文将揭秘它的内部机制:为什么 OCaml 的 Effect Handlers(效果处理器)能优雅地驱动 `try/catch` 错误捕获与 `break` 循环跳出?读完你会理解这套 JSON 查询工具控制流的完整实现思路 🧠 ## 什么是quer

gitblog_01111的博客 313

用友2018秋招Java笔试题复盘:基础、集合、JVM与多线程要点解析

Java后端校招笔试往往不以框架论英雄,而是用大量基础题检验语言功底与底层原理的掌握程度。从基本数据类型传参、String常量池,到HashMap扩容、JVM内存区域与OOM场景,再到多线程原子性、可见性与有序性,这些技术概念构成了笔试的核心知识链路。理解参数传递的本质、集合fail-fast机制、类加载双亲委派以及synchronized与volatile的适用边界,不仅能提升代码质量,更是应对实际工程中并发、内存调优等问题的关键能力。无论是ArrayList与LinkedList的选择,还是快速排序边界

weixin_33794672的博客 442
上一篇: 为什么匿名内部类需要访问局部变量需要加上final
下一篇: Java后台秋招面试题
Hpsyche
博客等级 码龄9年 1050粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值