情况一:(最普通用法)
public class Test {
public static void main(String[] args) {
System.out.print(tt());
}
public static int tt() {
int b = 23;
try {
System.out.println("yes");
return b += 88;
} catch(Exception e) {
System.out.println("error : " + e);
} finally {
if (b > 25) {
System.out.println("b>25 : " + b);
}
System.out.println("finally");
}
return b;
}
}
输出(开始)
yes
b>25 : 111
finally
111
输出(结束)
结论1 : 说明finally语句在return语句执行完了以后才执行的.
情况二:(finally中有return语句)
修finally部分
public static int tt() {
int b = 23;
try {
System.out.println("yes");
return b += 88;
} catch(Exception e) {
System.out.println("error : " + e);
} finally {
if (b > 25) {
System.out.println("b>25 : " + b);
}
System.out.println("finally");
return 100;
}
}
输出(开始)
yes
b>25 : 111
finally
100
输出(结束)
结论2:这样又说明了一个问题,finally语句块里面的return把原来的return给覆盖了,变成了新的返回值了.
情况三:(finally内改变返回值的value,但不返回)
继续修改
publicstatic int tt() {
intb = 23;
try{
System.out.println("yes");
returnb;
}catch (Exception e) {
System.out.println("error : " + e);
}finally {
if(b > 25) {
System.out.println("b>25 : " + b);
}
System.out.println("finally");
b = 100;
}
returnb;
}
输出(开始)
yes
finally
23
输出(结束)
结论3: 如果finally语句中没有返回语句覆盖的话,那么原来的返回值就不会变,不管你是不是改变了要返回的那个变量.
情况四:(在try、finally外,返回一个值,会不会改变try、finally内的返回值)
publicstatic int tt() {
int b = 23;
try {
System.out.println("yes");
return b = 88;
} catch(Exception e) {
System.out.println("error : " +e);
} finally {
if (b > 25) {
System.out.println("b>25 :" + b);
}
System.out.println("finally");
}
return 100;
}
输出(开始)
yes
b>25 : 88
finally
88
输出(结束)
结论4 : 如果try、finally内已经有return,则外部的return不会起作用。
总结:
碰到try语句中的return,那么先把return的值放在某个池中,然后执行finally里面的代码块,
如果有返回值覆盖语句,就改变先前放在池中的那个值;
如果没有,就把那个池中的东西取出来返回出去。
简单来说就是
---------对待try、finally内有return语句的情况,只有在finally覆盖return,才会改变返回值。否则即使在最外层return新值,也不会改变原有的return值。