结论
return expression;
如果try/catch中有return语句,执行到该语句时只是先计算expression的值(基本数据类型是确定的值,引用类型是地址)并暂存,然后执行finally代码块中的语句,如果finally中没有return语句,则返回到前面的return语句并返回相应的值,注意如果引用类型的对象在finally被修改,则影响留下;如果finally中有return语句,则会先计算该return语句中的表达式,并返回该值,即原暂存值被覆盖
/**
* @Author: Enoch
* @Version: V1.0
* @Time: 2021/8/8 20:59
*/
public class finally_ {
public static void main(String[] args) {
System.out.println(m1());
System.out.println(m2());
System.out.println(m3());
}
static int m1(){
int x = 1;
try{
return x; // 暂存1作为返回值
}finally {
x = 9; // 改变的是x的值,并未改变暂存的返回值
// return x; // 如果取消该return语句的注释,将重新计算return后面的表达式,并将结果作为返回值
}
}
static String m2(){
String str = "hhhh";
try{
return str; // 暂存str的地址,并不返回,而是跳入finally语句块里面
} finally {
str = "4543544"; // str指向改变
return str; // 覆盖掉原暂存的str地址,返回"4543544"所在的地址
}
}
static Re m3(){
Re re = new Re();
try{
return re; // 暂存re对象的地址,并不返回,而是跳入finally语句块里面
} finally {
re.x = 999;
re.s = "JET BRAIN";
return re; // 注释掉该return语句后 效果与注释掉前一样
}
}
}
class Re {
int x = 10;
String s = "jetBrain";
char c = 'A';
@Override
public String toString() {
return "Re{" +
"x=" + x +
", s='" + s + '\'' +
", c=" + c +
'}';
}
}
运行结果:
1
4543544
Re{x=999, s='JET BRAIN', c=A}