黑马程序员技术交流社区

标题: (已解决)java中finally子句的问题,为什么没有返回值? [打印本页]

作者: 曾_强    时间: 2012-5-25 02:09
标题: (已解决)java中finally子句的问题,为什么没有返回值?
本帖最后由 jiyixuan 于 2012-5-25 17:10 编辑
  1. public class TestTryCatch {

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

  5. public static int kkk(){
  6. int k = 0;
  7. try {        
  8. k += 2;
  9. return k;
  10. } catch(Exception e){        
  11. k++;
  12. return k;
  13. } finally {        
  14. k += 5;        
  15. }
  16. }
  17. }
复制代码
这个程序不应该输出为7吗?
开始我以为输出为7,可实际输出为2。调试后,可以肯定是执行了k+=5的,此时k为7。可是为啥那么没有返回喃?输出的是2 ,为什么 ?

finally子句运行后的值在哪儿。不需要返回么?

查阅知道,try中或者catch中的k如果执行到,都会被压栈,等待执行finally语句。有谁能解释一下压栈是什么意思呀?其原理是什么?


作者: 闾丘日月    时间: 2012-5-25 02:58
lz每次调用一个函数或者说方法的时候,为什么调用完了以后,还能不影响主函数的变量的值呢??
就是因为调用函数之前,CPU会将函数的所有该记住的属性都记住,这些属性记到哪里去了?就是记到栈内存当中了,你自己都说了执行finally之前会将try语句压栈
那么相当于try调用了一次finally函数,函数用了局部变量为k,调用完以后返回的当然就是2了。
如果lz学过一点点汇编就知道,其实这个就是 call  和ret 指令。

作者: 田建    时间: 2012-5-25 07:28
学习的飘过!
作者: 李红飞    时间: 2012-5-25 07:30
public class TestTryCatch {



public static void main(String args[]){

System.out.println(kkk());         //程序调用kkk()方法  

}



public static int kkk(){

int k = 0;
   
try {                    //调用kkk()方法先执行try()语句
        
k += 2;                //返回k=2

return k;           //执行到这里处返回k=2,即结果中的2

} catch(Exception e){        

k++;

return k;

} finally {         //程序最后一定会执行的语句

k += 5;        //     k=2+5=7

}

}

}
由于程序只调用一次kkk()方法 ,虽然会使得k=7,但是会先返回k=2 !!
作者: 黑马11期李项京    时间: 2012-5-25 08:49
李红飞 发表于 2012-5-25 07:30
public class TestTryCatch {

简单来说,就是被return了,return完,程序员停止,返回值即return返回的值:victory:
作者: niceBoy    时间: 2012-5-25 12:27
好问题,学习了。
作者: 攻城狮    时间: 2012-5-25 12:49
运行结果是2,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。_摘自张老师面试宝典··

作者: 李斌    时间: 2012-5-25 12:54
学习了 ~~~~
作者: 曾_强    时间: 2012-5-25 17:28
谢谢兄弟们。finally语句虽然执行但并未返回值,糊涂呀
作者: 揭耀祖    时间: 2012-5-25 21:43
我个和我之前发的一个小程序的贴子有点相同
作者: 付左军    时间: 2012-5-25 22:18
fianlly 会在在return2之前执行,所以虽然执行了K=5但是最会return的是2





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2