基础知识:
java方法是在栈帧中执行,栈帧是线程私有栈的单位,执行方法的线程会为每一个方法分配一小块栈空间来作为该方法执行时的内存空间。
栈帧都包括了局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附加信息。
局部变量表:一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。
操作数栈:是一个后入先出栈,用来保存正在执行的表达式中的操作数。
代码
示例1:
public class TestTryCatch {
public static void main(String[] args)
{
TestTryCatch test = new TestTryCatch();
System.out.println(test.fun());
}
public int fun()
{
int i = 10;
try
{
//doing something
return i;
}catch(Exception e){
return i;
}finally{
i = 20;
}
}
}
输出结果:10
示例2:
public class TestTryCatch {
public static void main(String[] args)
{
TestTryCatch test = new TestTryCatch();
System.out.println(test.fun());
}
public StringBuilder fun()
{
StringBuilder s = new StringBuilder("Hello");
try
{
//doing something
s.append("Word");
return s;
}catch(Exception e){
return s;
}finally{
string.append("finally");
}
}
}
输出结果:HelloWordFinally
结论:
return 表达式;
执行顺序如下:
1、执行表达式,结果保存在操作数栈顶;
2、将操作数栈顶值(表达式的结果)复制到局部变量区作为返回值;
3、执行finally中的代码;
4、将第2步复制到局部变量区的返回值又复制回操作数栈顶;
5、执行return,返回操作数栈顶的值;
当返回值是基本数据类型,操作数栈中的值就是它本身,所以值不变;当返回值不是基本类型,操作数栈中存放的是它的地址,所以值会改变。
其实return与finally并没有明显的谁强谁弱。在执行时,是return语句先把返回值写入但内存中,然后停下来等待finally语句块执行完,return再执行后面的一段。