文本内容
1 执行过程
2 return语句
1 执行过程
2 return语句
规则:
(1)根据执行过程,最后一个执行的return语句生效;
(2)执行return语句时,返回值就已被确定,后续对相应变量的修改将无效。
// 返回值:4
public static int testFinally() {
int a = 1;
try {
a = 2;
return a;
} catch (Exception ioe) {
a = 3;
return a;
} finally {
a = 4;
return a;
}
}
// 返回值:2
public static int testFinally() {
int a = 1;
try {
a = 2;
return a;
} catch (Exception ioe) {
a = 3;
return a;
} finally {
a = 4;
}
}
原因分析:
在try块中执行到return a,由于存在finally块,因此,返回动作暂停,并将此时应返回的值(2)压入栈;
执行finally块代码,将变量a赋值为4;
执行完finally块,恢复返回动作,从栈中弹出要返回的数据(2)并返回。
// 返回值:3
public static int testFinally() {
int a = 1;
try {
a = 2;
a = 1 / 0; // 除数为零异常
return a;
} catch (Exception ioe) {
a = 3;
return a;
} finally {
a = 4;
}
}
原因分析:
同上一例子相同,最后一次执行到的return语句发生在catch块,当时的返回值为3。
特殊情况:
若返回的内容是引用类型(地址),则在执行最后一次return语句的时候,仅仅是确定了返回的引用值(地址)。
因此,若在finally块中,修改该引用指向的对象的属性值,修改的内容是可以生效的。
若理解基本数据和引用在内存中存储形式的相关知识,就不难理解其中的原因,其最终返回值依然是遵循之前说的规则:
最后一个执行的return语句生效,其返回值在执行相应return语句时就被确定(只是,这里确定的是引用)。