A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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语句。有谁能解释一下压栈是什么意思呀?其原理是什么?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

10 个回复

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

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
学习的飘过!
回复 使用道具 举报
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 !!
回复 使用道具 举报
李红飞 发表于 2012-5-25 07:30
public class TestTryCatch {

简单来说,就是被return了,return完,程序员停止,返回值即return返回的值:victory:
回复 使用道具 举报
好问题,学习了。
回复 使用道具 举报
攻城狮 黑马帝 2012-5-25 12:49:30
7#
运行结果是2,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。_摘自张老师面试宝典··
回复 使用道具 举报
李斌 中级黑马 2012-5-25 12:54:47
8#
学习了 ~~~~
回复 使用道具 举报
谢谢兄弟们。finally语句虽然执行但并未返回值,糊涂呀
回复 使用道具 举报
我个和我之前发的一个小程序的贴子有点相同
回复 使用道具 举报
fianlly 会在在return2之前执行,所以虽然执行了K=5但是最会return的是2
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马