【java】源码详解try_catch_finnaly语句执行

本文详细解析了Java中try、finally与return语句的执行顺序及内部机制,通过具体示例帮助读者理解不同场景下finally块如何影响方法的返回值。

面试过的同学应该有一道题的记忆,因为大多java程序员面试场合都会发生这样的事件。

试题如下:

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

……………………


…………


希望不要早早看下面的解释,自己想一下


………………


…………



也许你的答案是在return 之前,但往更细地说,是在return 中间执行


看源码:

package dec;

/**
 * 
 * 
 * <p>
 * Title: try_catch_finally测试代码 /p>
 * 
 * <p>
 * Description: 示例 业务类
 * </p>
 * 
 * <p>
 * Copyright: Copyright (c) 2012
 * </p>
 * 
 * 
 * @author dml@2012-12-4
 * @version 1.0
 */
public class TestTryCatchFinaly {

	public static void main(String[] args) {
		System.out.println("test1返回结果:" + new TestTryCatchFinaly().test1());
	}

	int test1() {
		int x = 1;
		try {
			System.out.println("try打印:" + x);
			return x;
			//这句编译不通过
			// System.out.println("try打印:" + x);
		} finally {
			++x;
			System.out.println("finally打印:" + x);
		}
	}
}


以上程序运行结果:

try打印:1
finally打印:2
test1返回结果:1//运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。


明白了吧,先执行try中语句,然后遇到return时,将结果返回,接着执行finally中语句,后执行主函数语句。


接下来,看看这个函数:

public int test2() {
		try {
			return 1;
		} finally {
			return 2;
		}
	}

主函数中:

System.out.println("test2返回结果:" + new TestTryCatchFinaly().test2());

应该打印结果是?

…………


……………………


好好想想


………………

……

执行结果是:

test2返回结果:2

是不是有点晕了?不怕。。。。

看看解释怎么说的:

try 中的return 语句调用的函数先于finally 中调用的函数执行,也就是说return 语句先执行,
finally 语句后执行,所以,返回的结果是2。Return 并不是让函数马上返回,而是return 语
句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally 语
句后才真正开始返回。


这会儿应该懂了吧,测试一下:

int test3() {
		try {
			return func1();
		}

		finally {
			return func2();
		}
	}

	int func1() {
		System.out.println("func1被执行");
		return 1;
	}

	int func2() {
		System.out.println("func2被执行");
		return 2;
	}

主函数中:

System.out.println("test3返回结果:"+new TestTryCatchFinaly().test3());

执行结果是?

……………………


…………


func1被执行
func2被执行
test3返回结果:2

要是还不明白,看看上面的一句话

明白了吧,先执行try中语句,然后遇到return时,将结果返回,接着执行finally中语句,后执行主函数语句。

好好理解下

………………


…………


针对后面两个示例,可以这么总结:

明白了吧,先执行try中语句,然后遇到return时,将结果返回,接着执行finally中语句,遇到return,将结果返回(也就是最后打印的结果),最后执行主函数语句。



p.s.程序的好处是无论什么时候都是确定的,不确定的只有程序员是否真的掌握了,不要把技术看的太难,也不能把技术看的太简单,做对的事情要比把事情最对更重要。


dml@2012.12.4




内容概要:本文详细介绍了基于Matlab实现的“梯级水光互补系统最大化可消纳电量期望短期优化调度模型”,属于电力系统领域高水平科研成果的复现(EI级别)。该模型聚焦于梯级水电站与光伏发电系统的协同优化调度,通过构建短期优化调度框架,旨在提升可再生能源的电量消纳能力并最大化系统综合效益。研究采用先进的数学优化方法对水光资源进行联合调度,充分考虑了光伏出力的不确定性、水资源约束、系统运行边界条件及电力平衡要求,实现了在多重约束下的电量期望最大化目标。模型不仅具备严谨的理论基础,还具有良好的工程应用前景,适用于新能源高比例渗透背景下电力系统的优化调度研究与实践。; 适合人群:具备电力系统分析、可再生能源利用或优化建模背景的研究生、科研人员及工程技术人员,特别适合致力于复现高水平学术论文(EI/顶刊)研究成果的学习者与开发者。; 使用场景及目标:① 学习并掌握梯级水电与光伏系统协同调度的建模思路与关键技术;② 熟悉基于Matlab的混合整数线性规划(MILP)或其他非线性优化方法在能源系统中的实际应用;③ 提升在新能源消纳、短期调度优化等方向的科研建模能力与代码实现水平,支持二次开发与创新研究。; 阅读建议:建议结合Matlab代码与优化理论同步研读,重点理解目标函数的设计逻辑、各类物理与运行约束的数学表达以及求解器的调用流程,推荐使用YALMIP等建模工具辅助实现,以提高模型构建效率与可读性,便于深入理解与后续拓展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值