try-catch-finally 与返回值的修改
先看一段java代碼,func返回值為int:
1 public static int func() { 2 int result = 0; 3 try { 4 result = 1; 5 return result; 6 } catch (Exception e) { 7 result = 2; 8 return result; 9 } finally { 10 result = 3; 11 } 12 }正確的返回結果是,func返回1。
?
分析可總結為:
如果finally中沒有return語句,但是改變了要返回的值,這里有點類似與引用傳遞和值傳遞的區別,分以下兩種情況,:
1)如果return的數據是基本數據類型或文本字符串**,則在finally中對該基本數據的改變不起作用,try中的return語句依然會返回進入finally塊之前保留的值。
2)如果return的數據是引用數據類型,而在finally中對該引用數據類型的屬性值的改變起作用,try中的return語句返回的就是在finally中改變后的該屬性的值。
?
return 是String類型的code:
1 public static String funcStr() { 2 String result = "hello"; 3 try { 4 result = "1"; 5 return result; 6 } catch (Exception e) { 7 result = "2"; 8 return result; 9 } finally { 10 result = "3"; 11 } 12 }該函數返回值為字符串”1”。
?
return?是引用數據類型(對象):
1 public static Person funcPerson() { 2 Person result = new Person(20); 3 try { 4 result.age = 30; 5 return result; 6 } catch (Exception e) { 7 result.age = 40; 8 return result; 9 } finally { 10 result.age = 50; 11 } 12 } 13 14 static class Person { 15 public int age; 16 public Person(int age) { 17 this.age = age; 18 } 19 }該函數的返回類型是resultPerson,age為50,即在finally中更改了有效。
?
總結:
如果沒有異常出現,而且finally語句中沒有return,則會執行try里邊的return,并且,會將變量暫存起來(對象存的是引用的地址),再去執行finally中的語句,這時候,如果返回值是基本數據類型或者字符串,則finally相當于更改副本,不會對暫存值有影響;但是,如果返回值是對象,則finally中的語句,仍會根據地址的副本,改變原對象的值。所以上邊的例子,返回值的age為50。
轉載于:https://www.cnblogs.com/sunweiye/p/10952319.html
總結
以上是生活随笔為你收集整理的try-catch-finally 与返回值的修改的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spark hbase
- 下一篇: shp文件导入数据库