Java异常中finally的使用

jkfox
发布于 2020-9-16 15:54
浏览
0收藏

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时,备份的是一个数值,之后从备份中查找数据还是那个数值,没有改变.

 

 

作者:QwoYko.

来源:CSDN

分类
已于2020-9-16 16:22:43修改
收藏
回复
举报
回复
    相关推荐