参考文章:关于Java中finally语句块的深度辨析
仅考虑程序正常执行的情况下,不考虑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