finally语句在异常处理中的执行顺序与return语句的关系解析

public class Class_Demo {
	public static void main(String[] args){
			Class_Demo s = new Class_Demo();
			int a=s.fun();
			System.out.println(a);
	}
	int fun(){
		(1)int x=5;
		try{			
		(2)	System.out.println(x/0);
			return 0;
		}(3):catch(ArithmeticException e){
			(7)return (4)++x;
		}(5)finally{

finally语句在异常处理中的执行顺序与return语句的关系解析

			(6)x=4;
		}
	}
}

我们说,无论try语句中是否有例外,我们都将执行最终语句,但是哪个语句将首先执行?上面的代码将有一个例外,该例外将划分为0并被捕获语句捕获,然后在捕获语句中返回X的值,但是什么时候最后执行语句?在这里,我们可以将返回++ x语句视为两个子故事。 TRY语句中发生了0个除法的例外,因此下面的返回0语句未执行,并且直接跳到捕获语句并执行返回。正如我们之前所说,返回++ X被视为两个子故事。此时,首先执行++ X的值,然后在返回语句中保存此值的副本(此时未返回),然后在最后的语句中执行语句,最后执行返回。尽管x的值最终分配给4,但它不会影响返回语句中存储的值,因此返回为6,输出为6。

从中,我们可以看到,最终值的值不会影响返回保存的副本的值。这等同于传递函数参数,例如fun(int a),假设b = 5,fun(b)无论您如何修改函数中的形式参数a的值,调用娱乐函数中的实际参数B不会更改,并且仅通过了B的副本。数字(1)(2)(3)(4)(5)(6)(7)是娱乐函数中的执行顺序。

int fun(){
		int a=5;
		try{			
			System.out.println(a/0);
			
			return 0;
		}catch(ArithmeticException e){
			return ++a;
		}finally{
			return ++a;
		}
	}

以上代码返回7,这也验证了我们从侧面对第一个代码的正确理解。但是,此处的返回直接返回到最后,因此在捕获语句中只执行++ a,而不是捕获量返回。

public class Class_Demo {
	public int num;
	public static void main(String[] args){
			Class_Demo s = new Class_Demo();
			Class_Demo a=s.fun();
			System.out.println(a.num);
	}
	Class_Demo fun(){
		Class_Demo obj = new Class_Demo();
		obj.num=5;
		try{
			System.out.println(obj.num/0);
			return obj;
		}catch(ArithmeticException e){
			return obj;
		}
		finally{
			obj.num=10;
		}
	}
}

上面的代码输出10,显然最终返回修改后的值。对象将在此处返回,也可以说它就像函数参数传递一样,形式参数是对象,而存储在返回中的对象是对对象的引用。您可以修改对象成员,不可避免地会影响返回参考的结果。 (如果返回的类型不是基本类型,则最终返回的结果将受到影响)

总而言之,Try语句也不例外,并且具有回报值。执行订单与捕获语句中具有异常的返回值的返回语句相同,并且捕获了相应的捕获量。首先执行,然后在相应的返回返回之前执行最终语句之前执行(如果最终返回,它将直接返回到最终中)。

最终不会执行的情况:关闭JVM(System.EXIT(0),在执行之前关闭电源)

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

25阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读