异常中finally的使用

tech2022-10-14  102

finally: (1)必然执行的异常统一处理出口。 (2)无论是否发生异常.finally必然执行,适合存放释放资源,后续处理的代码。

总之就是,大部分的情况下,finally一定会执行,但是也有不先执行finally执行的特例=> (1)finally里发生异常.程序不会执行(finally第一句产生异常后续的不会执行)。 (2)程序所在线程死亡或关闭了cpu,也就是说外界不可抗力的因素造成的电脑突然关机,停电等。

下面看一下两个finally一定会执行后的不同结果: 首先先描述一下执行的过程,如果try中有return时,再返回阶段时,会去先执行finaly里的程序。

(1)finally执行后数值改变 public static void main(String[] args){ Person p = show(); System.out.println(“年龄是”+p.age);

} public static Person show(){ Person person = new Person(); try{ //这里赋予person的年龄是18 person.age=18; return person; }catch(Exception e){ }finally{ //finally里改变person的年龄 person.age=38; } return person; }

输出的结果是:年龄是38

(2)finally执行后数值没有改变 public static void main(String[] args){ int ageNum = show(); System.out.println(“年龄是”+ageNum);

} public static int show(){ int age; try{ age = 18; return age; }catch(Exception e){ }finally{ age = 38; } return age; }

输出结果是:年龄是18

其实在这两个案例中,finally都执行了,第一个是引用类型的数值,引用的是地址.而第二个是非引用数据类型。 在程序编译后,会被编译成字节码.class文件,当被打包成一个文件后,这个文件就是独立的,引用的外部数值就会在打包前进行数据备份。 (1)程序中在return时,将person.age备份,这里备份的是一个地址,当finally数值改变后,备份的数据仍旧是一个地址,通过地址查找到的数值就是已经改变掉数值。 (2)程序中在return时,备份的是一个数值,之后从备份中查找数据还是那个数值,没有改变。

最新回复(0)