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
这里有类成员的例子,而且总结的很好。
结果今天写了一下很出乎意料,对于基本类型,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
这里有类成员的例子,而且总结的很好。
相关文章推荐
- try{}catch(){}finally{}语句中return的执行情况
- (转)java 中的try catch finally 语句中含有return语句的执行情况(总结版)
- Java中try catch finally语句中含有return语句的执行情况(总结版)
- Java中try catch finally语句中含有return语句的执行情况(总结版)
- try catch finally中有return语句的执行情况及原因分析
- Java中try catch finally语句中含return语句的执行情况总结-编程陷阱
- 各种return情况下try,catch,finally的执行顺序
- Java中try catch finally语句中含return语句的执行情况总结-编程陷阱
- 有return语句情况下,try-catch-finally的执行顺序
- try-catch-finally语句中有return语句时的执行情况
- Java中try catch finally语句中含有return语句的执行情况
- 转载—Java中try catch finally语句中含有return语句的执行情况(总结版)
- Java中try catch finally语句中含有return语句的执行情况(总结版)
- java基础学习之try catch finally语句中含有return语句的执行情况
- (转)java 中的try catch finally 语句中含有return语句的执行情况(总结版)
- Java中try catch finally语句中含有return语句的执行情况(总结版)
- Java中try catch finally语句中含有return语句的执行情况(总结版)
- try catch finally中return语句与非return语句的执行顺序问题
- 有return的情况下try catch finally的执行顺序(最有说服力的总结)
- 有return的情况下try catch finally的执行顺序