一、第一次试验
public static void main(String[] args) throws InterruptedException {System.out.println(aaa(null));}private static StringBuilder aaa(Integer i) throws InterruptedException {StringBuilder sb = new StringBuilder();try {i.toString();return sb;} catch (Exception e) {sb.append("1");return sb;}finally {sb.append("2");Thread.sleep(5000);System.out.println("sb:" + sb);}}
结果为
sb:12
12
二、第二次试验
public static void main(String[] args) throws InterruptedException {System.out.println(aaa(null));}private static String aaa(Integer i) throws InterruptedException {String a;try {i.toString();a = "1";return a;} catch (Exception e) {a = "2";return a;}finally {a = "3";Thread.sleep(5000);System.out.println("a: " + a);}}
结果为
a: 3
2
三、分析
1、通过线程睡眠可以判断出 finally 在 return 前执行的
2、return 后面的代码 会根据所在行先后顺序执行, return的是堆里的对象
3、第一个实验因为修改了堆里的对象所以影响了最终结果
四、验证
private static String aaa(Integer i) throws InterruptedException {String a;try {i.toString();a = "1";return a;} catch (Exception e) {a = "2";}finally {a = "3";Thread.sleep(5000);System.out.println("a: " + a);}return a;}
结果为
a: 3
3
结论正确