首先,finally中的代码是一定会执行的,不管之前的代码是否抛出异常。
1、对于try中的return,在没有异常的情况下:
先执行return之前的代码啊,包括return语句中的代码,但不会返回结果,然后跳到finally中执行。
对于return的结果,如果是基本数据类型(int,string .......),会先存到栈中,finally中的语句不会对其产生影响;
如果是非基本类型(list,map ...........), 会存到堆中,finally 中的语句会对其产生影响。
等 finally 中的语句结束,return 结果(如果finally中没有return,当然,finally中基本上是不出现return的)。
2、如果发生异常,try中的return自然不会执行,跳到catch中:
catch 中包含return,执行catch中的代码,返回的结果还是跟上面一样,要看结果的数据类型,判断finally 是否对返回的结果产生影响。
catch中不包含return,那么最终的return在finally之外,finally自然会影响结果。
需要注意的是,在try或者catch中包含return时,finally 中并不是不改变结果,只是不会改变return返回的结果,看下面的例子:
对于第一种情况,写一个静态方法,main函数中做调用(ThreadTest 是随便起的类名):
public static void main(String[] args) {
System.out.println("ert1-------- "+ThreadTest.ert1());
System.out.println("qweqwe------ "+ThreadTest.qweqwe());
}
//基本类型
static int ert1()
{
int i = 1;
try {
i++;
return ++i ; //若果是i++,返回的是2
}
finally {
++i;
}
}
//非基本类型(以list为例)
static List<String> qweqwe()
{
List<String> list = new ArrayList<>();
try {
list.add("111");
return list;
} finally {
list.add("222");
System.out.println("finallyList........"+list);
}
}
执行结果:可以看到,虽然finally中把变量 i 改成 4,但返回的依然是 3,但是对于非基本类型的list ,finally加入的"222"在try里的return中也被写入。
对于产生异常的情,举例说明:
先把return放在catch块中看结果:
static int ert2() {
int i = 1;
try {
i++;
//这里写一段有异常的代码:
int num = 5/0;
return ++i ; //若果是i++,返回的是2
}
catch (Exception e) {
i=123;
e.printStackTrace();
return i;
}
finally {
++i;
System.out.println("finally2......."+i);
}
}
运行结果哦 : finally 依然对返回的 int 类型的结果无影响(实际在内存中,i=124)
如果把函数 ert2() catch中的return 放到finally大括号后面,返回的 “i” 会是 124。