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{
(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),在执行之前关闭电源)