先贴代码:
package net.chinaedu.projects.venus;
import java.util.HashMap;
import java.util.Map;
public class FinallyTest {
public static void main(String[] args) {
StringTest str = new StringTest();
System.out.println("str===" + str.getValue());
ObjectTest obj=new ObjectTest();
System.out.println("obj===" + obj.getMap());
}
}
class StringTest {
public String getValue() {
String j = "string_orgin";
try {
j="string_try";
return j;
} finally {
j = "string_finally";
}
}
}
class ObjectTest {
public Map<String, String> getMap() {
Map<String, String> argMap = new HashMap<String, String>();
try {
argMap.put("tryKey", "2");
return argMap;
} finally {
argMap.put("finalKey", "2");
}
}
}
输出:
str===string_try
obj==={tryKey=2, finalKey=2}
总结:在return返回之前 会将return的值拷贝一份,然后在执行finally,如果拷贝的变量类型是基本类型 那么finally不能改变其原来的值 但是如果是对象 那么因为拷贝的一个对象引用 finally会改变原来在堆中的对象,所以会影响return 值
PS:顺序一定是执行try块,在执行finally 但是因为return返回机制的原因 导致因为返回类型导致的数据不同
原标题:finally和return 执行顺序
关键词: