参考:
https://www.ibm.com/developerworks/cn/java/j-lo-finally/
http://www.cnblogs.com/lanxuezaipiao/p/3440471.html
finally 语句块一定会执行吗?
有两个前提条件
1.try块已经得到执行
2.不能出现Error.比如关停了JVM
finally块执行的时机
try或者catch return的语句执行时候,但是在实际return之前,执行finally
如果try或者catch中有返回,finally块的定位
相当于在try或者catch中调用了一个函数.和普通函数调用中传值,传址那套.一样一样的.
如果finally中有return,会直接覆盖try或者catch中的return
开始举栗子:
1.finally语句在return语句执行之后return返回之前执行的。
-
public class T {
-
public static void main(String[] args) {
-
-
System.out.println(test1());
-
}
-
-
public static int test1() {
-
int b = 20;
-
-
try {
-
System.out.println("try block");
-
-
return b += 80;
-
} catch (Exception e) {
-
-
System.out.println("catch block");
-
} finally {
-
-
System.out.println("finally block");
-
-
if (b > 25) {
-
System.out.println("b>25, b = " + b);
-
}
-
}
-
-
return b;
-
}
-
}
结果:
try block
finally block
b>25, b = 100
100
说明try块中的b+=80 已经执行完毕,才进入finally块.
2.finally块中的return语句会覆盖try块中的return返回。
-
public class T {
-
public static void main(String[] args) {
-
-
System.out.println(test2());
-
}
-
-
public static int test2() {
-
int b = 20;
-
-
try {
-
System.out.println("try block");
-
-
return b += 80;
-
} catch (Exception e) {
-
-
System.out.println("catch block");
-
} finally {
-
-
System.out.println("finally block");
-
-
if (b > 25) {
-
System.out.println("b>25, b = " + b);
-
}
-
-
return 200;
-
}
-
-
-
}
-
}
try block
finally block
b>25, b = 100
200
也就是说如果finally中有return语句,会覆盖原来try或者catch中的return语句.
3.如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变。
就是原来传值,传址那一套...
所谓传值的..
-
public class T {
-
public static void main(String[] args) {
-
-
System.out.println(test3());
-
}
-
-
public static int test3() {
-
int b = 20;
-
-
try {
-
System.out.println("try block");
-
return b += 80;
-
} catch (Exception e) {
-
-
System.out.println("catch block");
-
} finally {
-
-
System.out.println("finally block");
-
-
if (b > 25) {
-
System.out.println("b>25, b = " + b);
-
}
-
-
b = 150;
-
}
-
-
-
return 2000;
-
}
-
}
结果:
try block
finally block
b>25, b = 100
100
传址的
-
import java.util.HashMap;
-
import java.util.Map;
-
-
public class T {
-
public static void main(String[] args) {
-
System.out.println(getMap().get("KEY").toString());
-
}
-
-
public static Map getMap() {
-
Map map = new HashMap();
-
map.put("KEY", "INIT");
-
-
try {
-
map.put("KEY", "TRY");
-
return map;
-
} catch (Exception e) {
-
map.put("KEY", "CATCH");
-
} finally {
-
map.put("KEY", "FINALLY");
-
map = null;
-
}
-
-
return map;
-
}
-
}
结果:
FINALLY
传值传址本身就是一个不严谨的说法.
刚才传值的情况,如果将int改为Integer
-
public class T {
-
public static void main(String[] args) {
-
System.out.println(test3());
-
}
-
-
public static Integer test3() {
-
Integer b = new Integer(20);
-
-
try {
-
System.out.println("try block");
-
-
return b += 80;
-
} catch (Exception e) {
-
-
System.out.println("catch block");
-
} finally {
-
-
System.out.println("finally block");
-
-
if (b > 25) {
-
System.out.println("b>25, b = " + b);
-
}
-
-
b = new Integer(150);
-
}
-
-
return 2000;
-
}
-
}
结果:
try block
finally block
b>25, b = 100
100
给我的感觉,finally和以下的代码差不多
所以除非通过 指针b,修改原来对象的实际内容.
否则,修改 指针b指向别的对象,或者将指针b设置为null.都不能影响原来函数的返回值.
-
public class T {
-
public static void main(String[] args) {
-
System.out.println(test3());
-
}
-
-
public static Integer test3() {
-
Integer b = new Integer(20);
-
System.out.println("try block");
-
b += 80;
-
funcFinally(b);
-
return b;
-
}
-
-
private static void funcFinally(Integer b) {
-
-
System.out.println("finally block");
-
-
if (b > 25) {
-
System.out.println("b>25, b = " + b);
-
}
-
-
b = new Integer(150);
-
}
-
}
4.try块里的return语句在异常的情况下不会被执行。
-
public class T {
-
public static void main(String[] args) {
-
-
System.out.println(test4());
-
}
-
-
public static int test4() {
-
int b = 20;
-
try {
-
System.out.println("try block");
-
b = b / 0;
-
System.out.println("墓志铭:我觉得还能再抢救一下");
-
return b += 80;
-
} catch (Exception e) {
-
b += 15;
-
System.out.println("catch block");
-
} finally {
-
System.out.println("finally block");
-
if (b > 25) {
-
System.out.println("b>25, b = " + b);
-
}
-
b += 50;
-
}
-
return b;
-
}
-
}
由于代码11行发生异常,直接进入catch,finally处理.最终在24行返回.
注意这个时候,catch和finally块对b的修改,都可以反映在最终的结果中.
结果:
try block
catch block
finally block
b>25, b = 35
85
5.当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全一样。
-
public class T {
-
public static void main(String[] args) {
-
-
System.out.println(test5());
-
}
-
-
public static int test5() {
-
int b = 20;
-
try {
-
System.out.println("try block");
-
b = b / 0;
-
return b += 80;
-
} catch (Exception e) {
-
System.out.println("catch block");
-
return b += 15;
-
} finally {
-
System.out.println("finally block");
-
if (b > 25) {
-
System.out.println("b>25, b = " + b);
-
}
-
b += 50;
-
}
-
-
}
-
}
结果:
try block
catch block
finally block
b>25, b = 35
35
程序媛的总结:
最后总结:finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值
若finally里也有return语句则覆盖try或catch中的return语句直接返回。
我觉得吧...finally就别写return了.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-2101289/
,如需转载,请注明出处,否则将追究法律责任。