Java异常处理中finally什么时候不执行???执行的逻辑

阅读: 评论:0

Java异常处理中finally什么时候不执行???执行的逻辑

Java异常处理中finally什么时候不执行???执行的逻辑

finally语句块什么时候不执行?

1、没运行到try-catch语句这里就返回了。

1)在try语句之前,方法就有返回值,返回了,未执行到try语句。

int method{return 1; //直接返回,运行不到try语句try{}finally{}
}

2)在运行到try语句之前,方法出错了,程序就崩溃了。如: i = i / 0;        //抛出异常,未执行到try语句块

int method{int num = 1/0; //出错,程序终止,运行不到try语句try{}finally{}
}

2、运行到try-catch语句了,但是没运行到finally代码块的时候,JVM就停止了

1)停电、关机、硬件崩溃的时间刚好在运行try和finally之间的时候

2)在try语句运行的时候,直接把虚拟机退出了,如&#it(0);        //系统退出,未执行到finally语句块

int method{int num = 1; it();return num;    //不允许,因为上面的语句已经把JVM停止了,那么finally自然也不运行}finally{}
}

 

除此之外,程序中的finally必然运行!!!

 

finally的运行逻辑

finally就是在try备份好返回值的时候运行的。

总的顺序就是:try(如果有返回值)备份数据------->finally-------->(如果try有返回值)返回数据  -------->(如果程序仍要继续)后面的代码

也就是说不管try语句中有什么内容,finally语句一定会执行,哪怕是有返回值,也会在返回值返回之前把finally代码块执行了!

finally中没有返回值,try有返回值的两种类型:

1、基本数据类型

返回值是基本数据类型时,try备份的返回值是数据本身,finally代码块里无法对返回数据进行修改。

int num = 1;
try{return num;}finally{num = 2;}//无法修改num的值,返回值仍然是1

2、引用数据类型

返回值是引用数据类型时,try备份的是数据的地址值,fially可以通过地址值对数据进行修改。try返回地址值后,再通过这个地址去调用数据,数据就变成被finally修改过的了。

String str = "123";try{return str; //备份好str的地址值后,就去执行finally,然后才返回出去
}finally{str = "456";  //通过地址值去修改数据
}//可以修改数据,return的地址值对应的数据是"456"

finally中有返回值,try有返回值(基本数据类型)的类型:

执行到finally的代码块时,如果有return,那么这就相当于一个出口,数据会在finally这里直接返回出去。

哪怕try或者catch已经备份好了数据(或者数据地址值),那也不再运行try-catch里的return语句。

try{return 1;  //这里备份好数据,准备返回
}finally{return 2;  //这里直接返回2,哪怕try已经准备好返回1,也不再运行,程序结束。
}//注意:这里特意使用的基本数据类型,就是为了表明不是对数据的修改(因为没法修改),而是返回了另一个数据。

 

本文发布于:2024-02-02 01:31:32,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170681299840539.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:什么时候   逻辑   异常   Java   finally
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23