1. 程式人生 > >當try和finally中都有return的時候,結果是什麼?

當try和finally中都有return的時候,結果是什麼?

先亮一道面試

public static int func (){
    try{
        return 1;
    }catch (Exception e){
        return 2;
    }finally{
        return 3;
    }
}

下面函式的返回值是什麼?
答案是:3

這一題,一定要注意的是finally中的語句一定會執行。所以執行到finally裡面的return語句就會return3。而在try中遇到return 2;的時候只是先快取起來等待finally執行完,然後直接把快取的資料return出去。所以,一定要記住,finally中的修改語句不會影響到try和catch中return已確定的返回值。

但是如果finally中有返回值,就會直接覆蓋try,catch語句中的返回值,直接返回。

就上面的黑體字再舉一個例子:

public class Demo2 {
    int num = 0;

    public int fun() {
        try {
            return ++num;
        } catch (Exception e) {
            return 2;
        } finally {
            ++num;
        }
    }
    public static void main
(String[] args) { Demo2 demo2 = new Demo2(); int a = demo2.fun(); System.out.println(a); } }

這段程式碼的輸出語句很容易受到上面那段程式碼的影響,大家可能認為結果是2,然而正確結果是1。正如前面那句黑體字說的,finally語句不會影響到finally中的return語句已經確定的返回值。

那麼下面這段程式碼呢???

public class Demo2 {
    int num = 0;

    public int fun() {
        try
{ return ++num; } catch (Exception e) { return 2; } finally { //System.out.println(num); return ++num; } } public static void main(String[] args) { Demo2 demo2 = new Demo2(); int a = demo2.fun(); System.out.println(a); } }

這個結果是2,和上面的又不一樣了是吧。這裡大家不用犯暈,很容易理解的,就是在try中的return語句是把num變成了1,而finally中就把num又加了一次就變成 2 然後返回了。
其實可以在finally中加一個輸出語句輸出一下finally就可以明白了。