周五晚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,对原来的结果没有一点影响。