先看一段java代碼,func返回值為int: 正確的返回結果是,func返回1。 原因:如果finally中沒有return語句,但是改變了要返回的值,這裡有點類似與引用傳遞和值傳遞的區別,分以下兩種情況,: 1)如果return的數據是基本數據類型或文本字元串,則在finally中對該基本數據的 ...
先看一段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。