您的位置:首页 > 其它

关于try-catch-finally以及值类型和引用类型。

2013-11-14 11:26 375 查看
关于try-catch-finally以及值类型和引用类型。

finally是必须执行的,这点是毋庸置疑的。
return之前会先执行finally里的代码,对于非对象类型,finally里的代码不能通过重新给变量赋值来改变return语句的返回值,对于对象类型,和其不同,一个为复制,一个为引用。

也就是说,在进入finally之前,return已经将值压栈,而finally對值进行改变,并不影响值得返回,而对于引用就不一样了,压栈的是引用,返回的也是引用。

如果return是写在finally的话,就好办了,在finally对值进行改变,然后返回,退出程序。

JAVA CODE

public
class
Test_try {

public
static void
main(String[]
args) {

Test_try t=new
Test_try();

System.out.println("测试finally单纯修改返回值"
+ t.doPrint1());

System.out.println("测试finally修改返回值并返回"
+ t.doPrint2());

System.out.println("测试finally修改对象类型"
+ t.doPrint3());

System.out.println("测试finally修改对象类型并返回"
+ t.doPrint4());

}

private
int doPrint1(){

int
a = 0;

try{

a =
1;

throw
new SecurityException();

}

catch(Exception
e){

System.out.println("catch_begin");

a =
2;

return
a;

}

finally{

a=3;

System.out.println("finally_end"
+ a);

}

}

private
int doPrint2(){

int
a = 0;

try{

a =
1;

throw
new SecurityException();

}

catch(Exception
e){

System.out.println("catch_begin");

a++;

return
a;

}

finally{

a++;

System.out.println("finally_end"
+ a);

return
a;

}

}

private
StringBuffer doPrint3(){

StringBuffer
a =
new StringBuffer();

try{

a.append(1);

throw
new SecurityException();

}

catch(Exception
e){

System.out.println("catch_begin");

a.append(1);

return
a;

}

finally{

a.append(1);

System.out.println("finally_end"
+ a);

}

}

private
StringBuffer doPrint4(){

StringBuffer
a =
new StringBuffer();

try{

a.append(1);

throw
new SecurityException();

}

catch(Exception
e){

System.out.println("catch_begin");

a.append(1);

return
a;

}

finally{

a.append(1);

System.out.println("finally_end"
+ a);

return
a;

}

}

}

============

输出结果:

catch_begin

finally_end3

测试finally单纯修改返回值2

catch_begin

finally_end3

测试finally修改返回值并返回3

catch_begin

finally_end111

测试finally修改对象类型111

catch_begin

finally_end111

测试finally修改对象类型并返回111
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: