try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

简介: 会。 前。 准确的说,应该是在中间。(注意参考系) 示例代码如下: 1 package cn.itcast_07; 2 3 /* 4 * 面试题: 5 * 1:final,finally和finalize的区别 6 * final:最终的意思,可以修饰类、成员变量、成员方法 7 * 修饰类,类不能被继承。

会。
前。
准确的说,应该是在中间。(注意参考系)

示例代码如下:

 1 package cn.itcast_07;
 2 
 3 /*
 4  * 面试题:
 5  * 1:final,finally和finalize的区别
 6  *         final:最终的意思,可以修饰类、成员变量、成员方法
 7  *             修饰类,类不能被继承。
 8  *             修饰变量,变量是常量。
 9  *             修饰方法,方法不能被重写。
10  *         finally:是异常处理的一部分,用于释放资源。
11  *             一般来说,代码肯定会执行,特殊情况:如果在执行到finally之前jvm退出了,比如System.exit(0),则就不能执行了finally控制的语句体了。
12  *         finalize:是Object类的一个方法,用于垃圾回收。
13  * 
14  * 2:如果catch里面有return语句,请问finally里面的代码还会执行吗?
15  *       如果会,请问是在return前,还是return后。
16  *            会。前。(相对于最后一个能执行到的return语句来说)
17  *           准确的说,应该是在中间。
18  * 
19  * 3:try...catch...finally...的格式变形
20  *         A:try...catch...finally...
21  *         B:try...catch
22  *         C:try...catch...catch...
23  *         D:try...catch...catch...catch...finally...
24  *         E:try...finally...
25  *             这种做法的目前是为了释放资源但是异常没有处理。
26  */
27 public class FinallyDemo2 {
28     public static void main(String[] args) {
29         System.out.println(getInt());
30     }
31 
32     public static int getInt() {
33         int a = 10;
34         try {
35             System.out.println(a / 0);
36             a = 20;
37         } catch (ArithmeticException e) {
38             a = 30;
39             return a;
40             /*
41              * return a; 在程序执行到这一步的时候,这里不是return a; 而是return 30; 这个返回路径就形成了。
42              * 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
43              * 再次回到以前的返回路径,继续走 return 30;
44              */
45         } finally {
46             a = 40;
47             // return a; // 如果这样结果就是40了。这样的话就产生了一个新的返回路径
48         }
49         
50         return a;
51     }
52 }

结果为:

30

原因:注意完整的返回路径。

 

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
SQL 存储 监控
采用Opserver来监控你的ASP.NET项目系列(二、监控SQL Server与Asp.Net项目)
原文:采用Opserver来监控你的ASP.NET项目系列(二、监控SQL Server与Asp.Net项目) 前言 之前有过2篇关于如何监控ASP.NET core项目的文章,有兴趣的也可以看看.
1925 0
|
8天前
|
数据采集 人工智能 安全
|
4天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
298 164
|
3天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
307 155
|
11天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
840 6