Try finally return问题
一、Finally不能被执行的情况:
1、 程序没有执行到try代码块
2、 Try 或者catch中调用exit()方法让虚拟机关闭
二、当try和finally中同时含有return语句时,程序是如何执行的,看下面代码:
public class TryFinallyReturn {
public static void main(String[] args) {
// TODO Auto-generated method stub
demo();
}
static int demo()
{
try {
System.out.println("执行try代码块");
return test1();
}
finally {
System.out.println("执行finally代码块");
return test2();
}
}
static int test1()
{
System.out.println("执行try中的return语句");
return 5;
}
static int test2()
{
System.out.println("执行finally代码块中的return语句");
return 2;
}
}
运行结果:
执行try代码块
执行try中的return语句
执行finally代码块
执行finally代码块中的return语句
从运行结果我们可以看到是先执行try中的return语句再执行finally语句的,这与我们以前所认识的不太一样:遇到return语句就直接退出函数;那么在try..finally语句中时如何处理的呢?
实际上是将try语句中return返回的结果存储到一个局部变量中,接着再去执行finally语句,finally语句执行完再将try语句中的值返回(注意:这样的前提是finally代码块中没有return语句,finally语句中有return会导致函数提前结束),看下面两段程序程序,与上面程序基本一致
一、 将demo()方法的返回值输出
结果输出为2,返回的值为finally代码块中的返回值,因为finally中的return使函数结束,所以不会回到try语句中去将值返回,再看将finally语句中return语句去掉的输出结果:
返回的结果是try语句中的返回值。
三、又存在这样一个问题:try中的return将返回结果存入到局部变量中,那在finally语句中能否对该返回值进行修改。
先看结论:如果是引用型变量的话,可以修改
如果是基本类型变量的话,不可修改
为什么是这种结果是由于值传递和引用传递引起的。
来源:https://www.cnblogs.com/zhaolei1996/p/10581936.html