Java中try-finally块的执行顺序

本文主要介绍的关于异常处理的时候try-catch-finally块的执行顺序,一般情况下,finally块是会执行,在Java中,try-finally块的执行顺序通常遵循以下规则:

  1. try块中的代码首先被执行。
  2. 如果try块中的代码执行完毕,控制流将转到finally块。无论try块中的代码是否抛出异常,finally块中的代码都将被执行。
  3. finally块中的代码执行完毕后,整个try-finally块结束,控制流将继续到下一个语句或代码块。

但是有几种情况是不执行的,比如:

arduino 复制代码
    1). return语句在try之前,还没执行就返回了,当然不执行。 

    2). try语句中用了system.exit(0)强制退出JVM,暴力退出当然也不会执行。

其次为什么要介绍这一部分,首先重要的一点是,在很多面试题目中,会出现这样的题目,其次,理解掌握try-catch-finally块也有助于我们对异常处理的理解。

首先来看一段简单的代码(某公司的面试题)

javascript 复制代码
public class TestFinally2 {

	static String s="";
	public static void main(String[] args) {
		s=test();
		System.out.println("最终结果:"+s);
		
	}
	private static String test() {
		// TODO Auto-generated method stub
	
		try {
			s="a";
			System.out.println("try!");
			return s;//放入栈中,没有直接返回
		} finally {
			System.out.println("come finnal...");
			s="b";
			System.out.println("s:"+s);
		
		}
	}
}

运行结果:看到运行结果是不是很惊讶呢,最终结果为什么不是b呢

原因:try-finally块中try有return语句,但是执行完毕之后没有立即返回,因为要执行finally块,try中的return结果会放在类似一个队列中,之后如果finally中有return语句,则会把finally中的return语句中的结果放入队列中,最终的是队列中的第一个数据,即finally中return的结果。如果finally中没有return语句,不管怎么改变变量,返回结果还是try块改变的值。比如上面那道题,在try块中s为a,在finally中s为b,但是finally没有return,所以最终结果就是a。

总结:

  1. finally语句在try和catch语句中的return执行后、返回前执行;
  2. 若finally语句中没有return,则其执行结果不影响try和catch中已确定的返回值;
  3. 若finally语句中有return,则其执行后的结果会直接返回

根据了上面的结论和理解,我们在看一道题:

javascript 复制代码
public class TestFinally {

	public static void main(String[] args) {
		System.out.println(new TestFinally().test());
	}
	
	int test(){
		try{
			return func1();
			
		}
		finally{
			return func2();
		}
	}
	
	int func1(){
		System.out.println("func1");
		return 1;
	}
	int func2(){
		System.out.println("func2");
		return 2;
	}
}

运行结果:

想必根据我的结论应该可以容易得出吧!try块与finally块中都有return,所以最终返回结果就是finally中的return结果。

相关推荐
Thneonl18 小时前
Claude Code 频繁 Compacting?发布次日我根治了 2 个痛点
后端·rust
环境栈笔记20 小时前
指纹浏览器安卓怎么用?从运行位置到功能验收,先把三种方案分清
前端·人工智能·后端·自动化
小小张说故事20 小时前
Python 的 list 为什么能装下任何类型?拆开 PyObject* 数组,以及它让你多付了多少内存
后端·python
小蒜学长21 小时前
基于SpringBoot 框架的自媒体新闻系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·mysql数据库·自媒体新闻管理系统
IT_陈寒21 小时前
JavaScript实战技巧总结:深挖数组遍历的性能陷阱与实战解法
前端·人工智能·后端
学长毕设1 天前
基于springboot的食品仓库管理系统
java·spring boot·后端
滴滴答答哒1 天前
ASP.NET Core + FaceRecognitionDotNet 人脸识别实战:DI 单例、特征向量持久化与 1:N 比对
后端·asp.net
captain3761 天前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
IT_陈寒1 天前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
泡海椒1 天前
05-雷达图多维画像-信用评级多维画像
后端