黑马程序员技术交流社区
标题:
try,finally问题2
[打印本页]
作者:
杨剑
时间:
2013-2-25 16:15
标题:
try,finally问题2
本帖最后由 杨剑 于 2013-3-18 12:57 编辑
public class Test{
public static void main(String[] args) {
System.out.println(aaa());
}
public static int aaa(){
try {
return 1;
}finally{
return 2;
}
}
}
打印结果是2,为什么不是1呢,是不是2把1给覆盖了呢,不知道是如何执行的。
作者:
Gaara
时间:
2013-2-25 16:22
这问题跟你那个1 是一个问题。。。。。已经回答
作者:
李挺
时间:
2013-2-25 16:27
aaa这个函数在读到第一个return之前,还去读一读finally的内容,finally里面直接有return,所以第一个return就郁郁而终了
作者:
王钊
时间:
2013-2-25 16:29
首先,
除非在try块、catch块中调用了退出虚拟机的方法(System.exit(参数)),否则在执行怎样的代码,出现怎样的情况,异常处理的finally块总会被执行。
其次,在通常情况下,不要在finally块中使用如return或throw等导致方法终止的语句,否则会导致try块、catch块中的return、throw语句失效。
作者:
张宁
时间:
2013-2-25 16:32
原因就是在一个try-finally语句中,finally语句块总是在控制权离开try语句块时执行的。无论try语句块是正常结束的,还是意外结束的,情况都是如此。一条语句或一个语句块在它抛出了一个异常,或者对某个封闭型语句执行了一个break或continue,或是象这个程序一样在方法中执行了一个return时,将发生意外结束。它们之所以被称为意外结束,是因为它们阻止程序去按顺序执行下面的语句。
当try语句块和finally语句块都意外结束时,在try语句块中引发意外结束的原因将被丢弃,而整个try-finally语句意外结束的原因将于finally语句块意外结束的原因相同。在这个程序中,在try语句块中的return语句所引发的意外结束将被丢弃,而try-finally语句意外结束是由finally语句块中的return造成的。简单地讲,程序尝试着(try)返回(return)true,但是它最终(finally)返回(return)的是false。
丢弃意外结束的原因几乎永远都不是你想要的行为,因为意外结束的最初原因可能对程序的行为来说会显得更重要。对于那些在try语句块中执行break、continue或return语句,只是为了使其行为被finally语句块所否决掉的程序,要理解其行为是特别困难的。
总之,每一个finally语句块都应该正常结束,除非抛出的是不受检查的异常。千万不要用一个return、break、continue或throw来退出一个finally语句块,并且千万不要允许将一个受检查的异常传播到一个finally语句块之外去。
作者:
lzw123451
时间:
2013-2-25 22:41
我认为
一、finally肯定要执行
二、try中的return 后于finally执行 (可以认为执行了一半,因为finally的语句没有影响return变量的值)
三、finally中有return语句则必以此语句结束(那么try中的return语句就半途而废了)
这样可以看出 java中 finally语句会在程序结束的最后关头才运行(上例中它就在储存好数值准备返回的时候,执行finally语句)
一般的finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。
作者:
陈科宇
时间:
2013-2-25 23:39
这个问题被问过很多次了。你应该去看finally块的执行规则就很容易明白了。在try块里出现return时,JVM是会立即去执行finally块的内容。
因为finally块有return语句,try块里的return不再有 执行机会。
作者:
Benwolf0818
时间:
2013-2-26 11:47
try{}finally{}结构中,finally中的语句一定被执行有且只有一次。至于你问的问题为什么是2,而不是1,因为程序是先执行try{}中的内容,在 try {}中return 之前执行finally中的内容,可以加打印语句试验下
作者:
王昕
时间:
2013-2-26 14:10
感觉楼上有些回答有点问题,如果在try块中写return i++;这种i++其实是在finally块之前执行了的,只不过没有return。
int i = 0;
try{
return i++;
}finally{
System.out.println(i); //输出是1
……
}
作者:
何伟
时间:
2013-2-26 14:41
public class Test{
public static void main(String[] args) {
System.out.println(aaa());
}
public static int aaa(){
try {
return 1;//执行到这里,在return前finally会执行
}finally{
return 2;//执行到这里return会把2返回会,如果finally没有return打印的就是1;
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2