仅考虑程序正常执行的情况下,不考虑System.exit(0)等情况。不过关于“finally 语句块一定会执行吗?”这个问题确实会有一定的说法。
1,无控制转移语句,在return之前执行
(1) try { System.out.println("try..."); return; } catch (Exception e) { System.out.println("catch..."); } finally { System.out.println("finally..."); } output:会在try代码块return之前执行 try... finally... (2) try { System.out.println("try..."); throw new Exception(" "); } catch (Exception e) { System.out.println("catch..."); return; } finally { System.out.println("finally..."); } output:会在catch代码块return之前执行 try... catch... finally...
2,finally中有return
(1) public class Demo{ public static void main(String[] args) { System.out.println("result = " + test(10)); } public static int test(int i) { try { System.out.println("try..."); return i-1; } catch (Exception e) { System.out.println("catch..."); return i-2; } finally { System.out.println("finally..."); return i-4; } } } output:return的是6,finally中的结果 try... finally... result = 6 (2) public class Demo{ public static void main(String[] args) { System.out.println("result = " + test(10)); } public static int test(int i) { try { System.out.println("try..."); throw new Exception(); } catch (Exception e) { System.out.println("catch..."); return i-2; } finally { System.out.println("finally..."); return i-4; } } } output:return的是6,finally中的结果 try... catch... finally... result = 6 (3)finally中有无return,但是有运算 import java.util.HashMap; import java.util.Map; public class Demo{ public static void main(String[] args) { System.out.println("result = " + test(10)); } public static int test(int i) { Map<String, Object> map = new HashMap<String, Object>(); map.put("Demo", "Demo"); try { System.out.println("try..."); return i-1; } catch (Exception e) { System.out.println("catch..."); return i-2; } finally { System.out.println("finally..."); i = i-4; } } } output:return的是9,而不是10-4-1=5 try... finally... result = 9 (4)在finally中return import java.util.HashMap; import java.util.Map; public class Demo{ public static void main(String[] args) { System.out.println("result = " + test(10)); } public static int test(int i) { try { System.out.println("try..."); return i-1; } catch (Exception e) { System.out.println("catch..."); return i-2; } finally { System.out.println("finally..."); return i-4; } } } output:与(1)(2)类似,直接return了 try... finally... result = 6 (5)在代码块外面return public class Demo{ public static void main(String[] args) { System.out.println("result = " + test(10)); } public static int test(int i) { try { System.out.println("try..."); i--; } catch (Exception e) { System.out.println("catch..."); return i-2; } finally { System.out.println("finally..."); i = i - 4; } return i; } } output: try... finally... result = 5