try-catch-finally 與返回值的修改

try-catch-finally 與返回值的修改

轉載https://blog.csdn.net/Next_Second/article/details/73090994

先看一段java代碼,func返回值爲int:

public static int func() {

    int result = 0;

    try {

        result = 1;

        return result;

    } catch (Exception e) {

        result = 2;

        return result;

    } finally {

        result = 3;

    }

}

正確的返回結果是,func返回1。

原因:

如果finally中沒有return語句,但是改變了要返回的值,這裏有點類似與引用傳遞和值傳遞的區別,分以下兩種情況,:

1)如果return的數據是基本數據類型或文本字符串,則在finally中對該基本數據的改變不起作用,try中的return語句依然會返回進入finally塊之前保留的值。

2)如果return的數據是引用數據類型,而在finally中對該引用數據類型的屬性值的改變起作用,try中的return語句返回的就是在finally中改變後的該屬性的值。

return 是String類型的code:

    public static String funcStr() {

        String result = "hello";

        try {

            result = "1";

            return result;

        } catch (Exception e) {

            result = "2";

            return result;

        } finally {

            result = "3";

        }

    }

該函數返回值爲字符串”1”。

返回值是引用數據類型(對象):

    public static Person funcPerson() {

        Person result = new Person(20);

        try {

            result.age = 30;

            return result;

        } catch (Exception e) {

            result.age = 40;

            return result;

        } finally {

            result.age = 50;

        }

    }

 

    static class Person {

        public int age;

        public Person(int age) {

            this.age = age;

        }

    }

該函數的返回類型是resultPerson,age爲50,即在finally中更改了有效。

總結:

如果沒有異常出現,而且finally語句中沒有return,則會執行try裏邊的return,並且,會將變量暫存起來(對象存的是引用的地址),再去執行finally中的語句,這時候,如果返回值是基本數據類型或者字符串,則finally相當於更改副本,不會對暫存值有影響;但是,如果返回值是對象,則finally中的語句,仍會根據地址的副本,改變原對象的值。所以上邊的例子,返回值的age爲50。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章