try catch finally中的return 问题

来源:互联网 发布:windows无法输入密码 编辑:程序博客网 时间:2024/06/12 01:07

代码:

public class TestTryCatch {

public static void main(String args[]){
System.out.println(kkk());
}

public static int kkk(){
int k = 0;
try {
k += 2;
return k;
} catch(Exception e){
k++;
return k;
} finally {
k += 5;
}
}
}
输出结果为:2

 

public class TestTryCatch {

 public static void main(String[] args) {
  System.out.println(kkk());
 }

 public static StringBuffer kkk() {
  StringBuffer k = new StringBuffer();
  try {
   k.append(2);
   return k;
  } catch (Exception e) {
   k.append(3);
   return k;
  } finally {
   k.append(5);
  }
 }

}

 输出结果为:25

总结:

在try-catch-finally中,如果try-finally或者catch-finally中都有return,则两个return语句都执行并且最终返回到调用者那里的是finally中return的值;而如果finally中没有return,则理所当然的返回的是try或者catch中return的值,但是finally中的代码是必须要执行的。

方法在return的时候并不是把它所拥有的那个值给返回了,而是复制一份返回!因此,对于基本类型的数据,在finally中改变return的值对返回值没有任何影响,而对于引用类型的数据,就有影响。

 

1.finally块不管在什么时候都是需要执行的,即使你在try块中return了
2.return其实就是给函数中的一个隐藏变量赋值(学过vb的同学应该都知道,vb中函数的返回值就是给函数名赋值),
  所以你在try块中return的值会被finally中return的值覆盖掉。
3.引用类型和值类型的区别,引用类型指向的是同一个对象,一个改变大家都改变。值类型是每个人都有一份大家互不干扰。
StringBuilder是引用类型,所以在finally中改变的值会影响返回值,int是值类型所以再次改变i的值也不会影响到函数的隐藏变量的值!


finally的作用就是执行一些必要的代码,比如在程序抛出异常终止后,他还是会执行,所以一般用它来关闭数据库连接等一些必要也很重要的操作.

原创粉丝点击