黑马程序员技术交流社区
标题:
(已解决)java中finally子句的问题,为什么没有返回值?
[打印本页]
作者:
曾_强
时间:
2012-5-25 02:09
标题:
(已解决)java中finally子句的问题,为什么没有返回值?
本帖最后由 jiyixuan 于 2012-5-25 17:10 编辑
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;
}
}
}
复制代码
这个程序不应该输出为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