finally和return执行顺序

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

先贴代码:

importjava.util.HashMap;

import java.util.Map;

public class FinallyTest {

public static void main(String[] args) {

ObjectTest obj=new ObjectTest();

System.out.PRintln("obj=="+obj.getMap());

StringTest str = new StringTest();

System.out.println("str=="+str.getValue());

StringObjTest strObj=new StringObjTest();

System.out.println("strObj=="+strObj.getValue());

IntegerTest integer=new IntegerTest();

System.out.println("Integer=="+integer.getValue());

}

}

class IntegerTest {

public Integer getValue() {

Integer j = new Integer(1);

try {

j=new Integer(10);

return j;

} finally {

j=j+new Integer(100);

}

}

}

class StringTest {

public String getValue() {

String j = "string_orgin";

try {

j="string_try";

return j;

} finally {

j = "string_finally";

}

}

}

class StringObjTest {

public String getValue() {

String j = new String("stringobj_orgin");

try {

j=new String("stringObj_try");

return j;

} finally {

j = new String("stringObj_finally");

}

}

}

class ObjectTest {

public Map<String, String> getMap() {

final Map<String, String> argMap = new HashMap<String, String>();

try {

argMap.put("tryKey", "2");

return argMap;

} finally {

argMap.put("finalKey", "2");

}

}

}

返回结果:

obj=={tryKey=2, finalKey=2}

str==string_try

strObj==stringObj_try

Integer==10

总结:在return返回之前 会将return的值拷贝一份,然后在执行finally,如果拷贝的变量类型是string、基本类型、包装基本类型的Boolean Integer Double Long 因为这些类型都是不可变的,想要改变值只能拷贝一个原来的值,finally操作的值只是操作的一个拷贝, 但是如果是对象 那么因为拷贝的一个对象引用 finally会改变原来在堆中的对象,所以会影响return 值

PS:1、顺序一定是执行try块,在执行finally 但是因为return返回机制的原因 导致因为返回类型导致的数据不同

2、执行顺序:1、在return前将数据压入栈中(如果是Boolean Integer Double Long不可变类型或者string类型 直接将值压进去,如果是可变的那么把堆中的地址引用压进去)

2、执行finally语句,因为string和Boolean Integer Double Long为不可变类型变量,如果改变会另外申请一块常量池内存,但是不会改变栈中的值,而对象的话因为是引用 所以Finally会改变其真实值

3、最后return栈中的值

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航