週五晚6點下班去面試,出了一份筆試題,看到第一題有些蒙了,雖然之前遇到過相似的問題,但並無留心記一下,以爲沒人會這樣寫代碼,但實際上沒有面試題中是有的。java
1,有在try塊中執行不到finally的狀況嗎?面試
確定是有,在try塊中有System.exit(0);這樣的語句,System.exit(0);是終止Java虛擬機JVM的,連JVM都中止了,全部都結束了,固然finally語句也不會被執行到。測試
2,try和finally中的try,哪個會被執行?spa
確定是finally中的,由於不管try中寫了多少return,在return的一剎那,會被finally捕獲,以後執行finally中的代碼,finally中return了就沒有try中return什麼事了。code
3,try中return後的代碼會執行嗎?blog
會的,調用finally的時機是try塊真的要return時。get
1 public class FinallyTest3 { 2
3 public static void main(String[] args) { 4
5 System.out.println(test3()); 6 } 7
8 public static int test3() { 9 int b = 20; 10
11 try { 12 System.out.println("try block"); 13
14 return b += 80; 15 } catch (Exception e) { 16
17 System.out.println("catch block"); 18 } finally { 19
20 System.out.println("finally block"); 21
22 if (b > 25) { 23 System.out.println("b>25, b = " + b); 24 } 25
26 b = 150; 27 } 28
29 return 2000; 30 } 31
32 }
結果爲虛擬機
try block
finally block
b>25, b = 100
100
1 import java.util.*; 2
3 public class FinallyTest6 4 { 5 public static void main(String[] args) { 6 System.out.println(getMap().get("KEY").toString()); 7 } 8
9 public static Map<String, String> getMap() { 10 Map<String, String> map = new HashMap<String, String>(); 11 map.put("KEY", "INIT"); 12
13 try { 14 map.put("KEY", "TRY"); 15 return map; 16 } 17 catch (Exception e) { 18 map.put("KEY", "CATCH"); 19 } 20 finally { 21 map.put("KEY", "FINALLY"); 22 map = null; 23 } 24
25 return map; 26 } 27 }
結果爲it
FINALLY
爲何測試用例1中finally裏的b = 150;並無起到做用而測試用例2中finally的map.put("KEY", "FINALLY");起了做用而map = null;卻沒起做用呢?這就是Java究竟是傳值仍是傳址的問題了,簡單來講就是:Java中只有傳值沒有傳址,這也是爲何map = null這句不起做用。這同時也說明了返回語句是try中的return語句而不是 finally外面的return b;這句,不相信的話能夠試下,將return b;改成return 294,對原來的結果沒有一點影響。