黑马程序员技术交流社区
标题:
关于try catch finally运行的疑问
[打印本页]
作者:
李春阳
时间:
2012-6-7 17:37
标题:
关于try catch finally运行的疑问
首先是背景~
大家都知道try catch 语句中 finally是一定会执行的语句。
而return语句会返回一个值,且之后就不运行了~
那俩个加一起会怎么样呢。。
try{
return false;
}
finally{
return ture;
}
try catch finally这个语句在try里面的return就停下来呢?还是会怎样
最终返回什么值呢~首先是背景~
大家都知道try catch 语句中 finally是一定会执行的语句。
而return语句会返回一个值,且之后就不运行了~
那俩个加一起会怎么样呢。。
try{
return false;
}
finally{
return ture;
}
try catch finally这个语句在try里面的return就停下来呢?还是会怎样
最终返回什么值呢~
作者:
伊文龙
时间:
2012-6-7 17:51
当finally里面有return语句的时候,finally里的代码就不会被执行,否则,会在try里面的return 前执行。
作者:
罗文杰
时间:
2012-6-7 17:54
你的这个例子里,结果执行的是 finally里面的return;
比如说:
int x = 1;
try{
return x;
}
finally{
x++;
}
这时return的x的值还是1;
虽然finally执行了x++;但是try语句在return的时候就是当时x的值,他告诉调用他的函数我要return了,然后程序去执行 finally里面的x++;但是这时x的值跟return语句毫无关系,执行finally完毕后return 的还是x=1;如果finally里面有return语句的话:
int x = 1;
try{
return x;
}
finally{
x++;
return x;
}
这个时候在执行finally的时候 finally就抓住机会把return的值返回给了调用他的函数,就是return的值x=2。
作者:
伊文龙
时间:
2012-6-7 17:57
我感觉在在finally里面定义return语句,是没有意义的,finally子句为异常提供一个清理机制,一般用来释放使用的系统资源。
在finally里面定义return,有点喧宾夺主的意思,毕竟代码的主体在try语句中,这样违背常理的事情,java设计者应该不会干~~~
作者:
胡宝林
时间:
2012-6-7 18:02
finally只有在退出虚拟机的时候不执行
public class Demo {
public static void main(String[] args) {
try{
System.exit(0); //退出虚拟机后,finally中的代码就不会执行了,其他的无论什么情况都会执行finally中的代码
}catch (Exception e) {
}finally{
System.out.println("haha");
}
}
}
//还有就是在finally中的代码如果抛出异常,则finally中的代码不会再往下执行,如
finally{
x=1/0; //这句代码会抛出算术异常,此时不会再执行下面的 System.out.println("haha");
System.out.println("haha");
}
作者:
雷云红
时间:
2012-6-7 18:08
首先纠正一点,finally.不一定必须执行
作者:
杨永峰
时间:
2012-6-7 21:59
本帖最后由 杨永峰 于 2012-6-7 22:25 编辑
和这个帖子的问题很相似,但是似乎答案依然存在分歧:
http://bbs.itheima.com/forum.php ... 366&page=1#pid93915
以及这个
http://bbs.itheima.com/thread-16500-1-1.html
。除了JVM终止,最终return的值和异常语句所处的语句环境(上级代码块)有关,我坚持我在帖子回复的一个测试,先try中的语句块执行,然后finally执行。
作者:
杨天皓
时间:
2012-6-7 22:59
这么这个问题这么多人讨论。
我还是坚持我的理解。
就算在try里面遇到了return,那程序会先看有没有finally语句,如果有,就先执行了finally,再回到try。
下面这个代码也很明白。try遇到了return ,这个时候a=true,然后程序一看有finally,执行了finally,现在a=false,这个时候回到try,直接return a 出去,而这个时候a=false.
public static void main(String[] args)
{
System.out.println(test1());
}
public static boolean test1()
{
boolean a = true;
try {
return a;
} finally
{
a = false;
System.out.println("进来finally了");
return a;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2