转载两篇很好的文章:
- blog.csdn.net/xx326664162…
- blog.csdn.net/kavensu/art… 1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return语句执行之后,返回之前执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前就已经确定了;
4、finally中如果包含return,那么程序将在这里返回,而不是try或catch中的return返回,返回值就不是try或catch中保存的返回值了。
一、实例
1.try和catch中有return时,finally里面的语句会被执行吗 我们可以来分别看看 (1)执行try中的return时
public class tryDemo {
public static int show() {
try {
return 1;
}finally{
System.out.println("finally模块被执行");
}
}
public static void main(String args[]) {
System.out.println(show());
}
}
(2)执行catch中的return时
public class tryDemo {
public static int show() {
try {
int a = 8/0;
return 1;
}catch (Exception e) {
return 2;
}finally{
System.out.println("finally模块被执行");
}
}
public static void main(String args[]) {
System.out.println(show());
}
}
我们可以得出结论:
如果程序是从try代码块或者catch代码块中返回时,finally中的代码总会执行。而且finally语句在return语句执行之后return返回之前执行的。可以使用编译器的Debug功能查看详细过程。
2.如果finally也有return的时候
public class tryDemo {
public static int show() {
try {
int a = 8/0;
return 1;
}catch (Exception e) {
return 2;
}finally{
System.out.println("finally模块被执行");
return 0;
}
}
public static void main(String args[]) {
System.out.println(show());
}
}
结论:
我们可以看到当finally有返回值时,会直接返回。不会再去返回try或者catch中的返回值。
3.finally中对于返回变量做的改变会影响最终的返回结果吗 我们先来看一看如果try或者catch中的返回值是普通变量时。
public class tryDemo {
public static int show() {
int result = 0;
try {
return result;
}finally{
System.out.println("finally模块被执行");
result = 1;
}
}
public static void main(String args[]) {
System.out.println(show());
}
}
并不会改变返回的内容。 当返回的变量的类型是引用类型时,结果也是一样的 代码如下:
public class tryDemo {
public static Object show() {
Object obj = new Object();
try {
return obj;
}finally{
System.out.println("finally模块被执行");
obj = null;
}
}
public static void main(String args[]) {
System.out.println(show());
}
}
我们可以得出以下结论: 如果try和catch的return是一个变量时且函数的是从其中一个返回时,后面finally中语句即使有对返回的变量进行赋值的操作时,也不会影响返回的值。
二、概念
结论: 1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return语句执行之后,返回之前执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前就已经确定了;
4、finally中如果包含return,那么程序将在这里返回,而不是try或catch中的return返回,返回值就不是try或catch中保存的返回值了。
注意: finally修改的基本类型是不影响返回结果的。(传值的) 修改list ,map,自定义类等引用类型时,是影响返回结果的。(传址的)对象也是传址的 但是date类型经过测试是不影响的。有点奇怪。
举例: 情况1: try{} catch(){}finally{} return; 显然程序按顺序执行。
情况2: try{ return; }catch(){} finally{} return;
先执行try块中return 语句(包括return语句中的表达式运算),但不返回; 执行finally语句中全部代码 最后执行try中return 返回 finally块之后的语句return不执行,因为程序在try中已经return。 情况3: try{ } catch(){return;} finally{} return; 1、程序先执行try,如果遇到异常执行catch块,
有异常: 执行catch中return语句,但不返回 执行finally语句中全部代码, 最后执行catch块中return返回。 finally块后的return语句不再执行。 无异常:执行完try再finally再return… 情况4: try{ return; }catch(){} finally{return;}
执行try块return语句(包括return语句中的表达式运算),但不返回; 再执行finally块, 执行finally块,有return,从这里返回。 此时finally块的return值,就是代码执行完后的值
情况5: try{} catch(){return;}finally{return;}
程序执行catch块中return语句(包括return语句中的表达式运算),但不返回; 再执行finally块, 执行finally块,有return,从这里返回。 情况6: try{ return;}catch(){return;} finally{return;} 1、程序执行try块中return语句(包括return语句中的表达式运算),但不返回;
有异常:
执行catch块中return语句(包括return语句中的表达式运算),但不返回; 再执行finally块 执行finally块,有return,从这里返回。 无异常:
再执行finally块
执行finally块,有return,从这里返回。。
最终结论:
任何执行try 或者catch中的return语句之后,在返回之前,如果finally存在的话,都会先执行finally语句, 如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的, 编译器把finally中的return实现为一个warning。