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。