您的位置:首页 > 其它

try catch finally语块中有return语句的各种情况

2014-05-15 19:36 501 查看
今天做了一道题,回来练了下感到很奇怪。记得try catch语块中有return语句,也要先执行finally中的代码,然后再返回(注意:返回之前保留的值)。

  结果今天写了一下很出乎意料,对于基本类型,finally中改变变量值 不会影响try中的变量值;而对于对象或对象的成员变量则会影响,这应该就是值传递
 和引用传递的区别。我说的可能不清楚,直接看下面的例子:

public class TryCatchTest {

private static int test(){
int i=10;
try {
i++;
System.out.println("try "+i);
//return i;
return i+=10; //如果这里写成 i+=10,则会先执行i=i+10,保存这个结果然后到finally块中
} catch (Exception e) {
// TODO: handle exception
return 0;
}finally{
if(i>15){
i+=10;
System.out.println("finally "+i);
// return i; //如果有这句,则try中的return语句会被覆盖
}
System.out.println("finally "+i);
}
// return i; //catch中如果有return语句则这里就不能要(不可达),catch中没return则这里必须有
}
/**
* 上面是基本类型,现在用字符串来做测试(对象的成员变量也是如此)
* @return
*/
private static StringBuffer test1(){
StringBuffer str=new StringBuffer("abc");
try{
str.append("de");
System.out.println("try "+str);
return str;
}catch(Exception exception){
return null;
}finally{
str.append("fg");
System.out.println("finally "+str);
}

}
public static void main(String[] argStrings){
System.out.println(test());
System.out.println(test1());//finally里的改变影响了try中的变量(值传递和引用传递)

}

}本文参考了http://blog.csdn.net/ns_code/article/details/17485221

这里有类成员的例子,而且总结的很好。
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐