关于finally的一些常见面试题

74 阅读1分钟

1. 下面的代码return之后,fianlly还会执行吗?

public class Demo {
    public static void main(String[] args) {
        haha();
    }
    public static void haha(){
        try{
            System.out.println("1");
            System.out.println("2");
            System.out.println("3");
            System.out.println("4");
            return;
        }catch(Exception e){
        }finally {
            System.out.println("锄禾日当午,汗滴禾下土");
        }
    }
}

首先要明确一点:fianlly是 必然执行的异常统一处理出口,无论是否发生异常, finally必然执行。 所以会打印 "锄禾日当午,汗滴禾下土。"

接下来一个案例比较难理解。

2. 返回的年龄age是多少?

public class Demo6 {
    public static void main(String[] args) {
        Person p = haha();
        System.out.println(p.age);
    }
    public static Person haha(){
        Person p = new Person();
        try{
            p.age = 18;
            return p;
        }catch(Exception e){
            return null;
        }finally {
            p.age = 28;
        }
    }
    static class Person{//静态内部类
        int age;
    }
}


结果是28,后面用内存图来解释。

 p.age = 18;

将p对象中的age赋值为18,但是在执行return之前,要先执行finally里面的代码,所以age又被赋值为28。

3. a的值是多少

public class Demo7 {
    public static void main(String[] args) {
        int a = test();
        System.out.println(a);
    }
    public static int test(){
        int a = 10;
        try{
            return a;
        }catch(Exception e){

        }finally {
            a = 20;
        }
        return 0;
    }
}

先说答案,a还是10。和上面一道题的区别在于,一个是引用数据类型,一个是非引用数据类型。

画图分析

image.png

     return a;   

备份了一份返回值a=10,虽然后面对a重新赋值为20,但是最终结果还是10。可能不太好理解,两个例子结合起来看。

image.png return p; 返回了对象p中的内存地址,备份的也是p的内存地址,虽然也对这个内存地址备份了,但是后面的代码改的是内存地址中的内容,所以最后的结果也会改变。