关于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