当try和finally都包含return时的执行顺序
两段代码演示:
public class Demo4 { public static void main(String[] args) { System.out.println(new Demo4().test()); } int test(){ int x=1; try { return x; } finally { ++x; } } }
这段代码执行后的结果是:1
个人理解:当执行try中的语句时,返回值x现在存储的值是1,紧接着执行finally代码块++x,那么现在x的值是2
那么问题来了:return x的值是否变为2了?答案是否定的,此时return x的值还是1;
一旦return x的值确定,不管后面怎么操作,都不会影响。
public class Demo5 { public static void main(String[] args) { Demo5 d=new Demo5(); System.out.println(d.get()); } public int get() { try { return fun1(); } finally { return fun2(); } } int fun1(){ System.out.println("fun1"); return 1; } int fun2(){ System.out.println("fun2"); return 2; } }
这段代码执行的结果是:fun1 fun2 2
个人理解:当main方法调用get方法时会调到try语句块,紧接着回跳到fun1方法中,此时回执行fun1的执行语句 然后返回1到 return fun1();
try执行过后会执行finally代码块的语句,此时会跳到fun2方法中 执行fun2的输出语句 返回2到return fun2();
那么最后的结果就是 fun1 fun2 2
结论:(1) try finally return 执行顺序是 先执行try 语句块 然后执行 finally语句块 之后执行return
(2) 当try和finally中都出现return是 (前提不出现异常的情况) 以finally的语句块return为最后的结果
(3) 当return在try语句块中是 一旦确定了返回值 finally语句块不管怎么操作返回值,结果都是不变的。
反之当return在finally语句块中 try语句块先对返回值进行操作,那么此时的返回值以操作过后的为准