try-catch-finally容易犯的错误

测试环境 JDK1.8

1. catch中包含return

//有return的时候 输出13423
//无return的时候 输出134234
public class Trycatch {
    
    public static String output = "";
    public static void main(String[] args) {
        foo(0);
        foo(1);
        System.out.println(output);
    }

    private static void foo(int i) {
        try {
            if(i==1){
                throw new Exception();
            }
            output += "1";
        } catch (Exception e) {
            output += "2";
            //return;
        }finally{
            output += "3";
        }
        
        output += "4";
    }    
}

2. try中有return,finally里无return

public class Trycatch2 {

    public static void main(String[] args) {
        int k = test();
        System.out.println(k);
    }

    public static int test() {
        int a = 0;
        try {
            a = 1;
            return a;
        } finally {
            System.out.println("It is in final chunk");
            a = 2;
            //return a;
        }
    }

}

//输出结果
It is in final chunk
1

3. try中有return,finally里也有return

public class Trycatch2 {

    public static void main(String[] args) {
        int k = test();
        System.out.println(k);
    }

    public static int test() {
        int a = 0;
        try {
            a = 1;
            return a;
        } finally {
            System.out.println("It is in final chunk");
            a = 2;
            return a;
        }
    }

}

//输出结果
It is in final chunk
2

2和3的解析

解析2

当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序, 
在执行`a = 2`时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,
这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。

解析3

finally{}里也有一个return,那么在执行这个return时,就会更新临时栈中的值。同样,在执行完finally之后,就会通知主程序请求返回了,即将临时栈中的值取出来返回。故返回值是2.

 

posted @ 2017-09-07 09:55  皈依之路  阅读(540)  评论(0编辑  收藏  举报