请参阅以下代码并解释输出行为。
public class MyFinalTest {
public int doMethod(){
try{
throw new Exception();
}
catch(Exception ex){
return 5;
}
finally{
return 10;
}
}
public static void main(String[] args) {
MyFinalTest testEx = new MyFinalTest();
int rVal = testEx.doMethod();
System.out.println("The return Val : "+rVal);
}
}
结果是返回Val:10。
Eclipse显示警告:finally block does not complete normally
。
catch块中的return语句会发生什么?
答案 0 :(得分:72)
它被finally
中的那个覆盖,因为finally
在其他所有内容后执行。
这就是为什么,经验法则永远不会从finally
返回。例如,Eclipse显示了该代码段的警告:“finally块无法正常完成”
答案 1 :(得分:50)
finally
(唯一的例外是System.exit()
)。你可以这样想到这种行为:
答案 2 :(得分:18)
如果您记住VM的低级布局,这是一个简单的问题。
如果不确定这样的事情,请回到你对底层系统的理解(最终进入汇编级别)。
答案 3 :(得分:3)
始终执行finally
块(如果执行了匹配的尝试),所以在方法返回5之前,如catch
块中一样,它执行finally
块并返回10。
答案 4 :(得分:3)
最后,块始终执行,除非并且直到System.exit()语句在finally块中为第一个。
因此在上面的示例中,exe语句由try语句抛出并在catch块中获取catch。返回语句的值为 5 ,因此在堆栈调用值 5 中稍后会在最后执行的块上添加,并且最新的返回值将在堆栈顶部添加,同时返回值,堆栈按照堆栈行为返回最新值“LAST IN FIRST OUT”所以它将返回值 10。
答案 5 :(得分:0)
finally部分将执行始终执行。例如如果你有任何事情要发布,或者注销某种东西,如果发生错误,那么去catch部分,否则最终会执行。
Session session // opened some session
try
{
// some error
}
catch { log.error }
finally
{ session.logout();}
它不应该用于返回任何东西。你可以在外面使用。
答案 6 :(得分:0)
简而言之,无论返回是在 try 还是 catch 块中出现,我们都可以说最终阻止了返回语句。
总是最终在该用例中占主导地位。
public static int m1() {
try {
return 100;
}
catch(Exception e)
{
return 101;
}
finally {
return 102;
}
}
输出-102
答案 7 :(得分:0)
finally块将始终执行(唯一的例外是它在它之前的任何地方都遇到System.exit()),因此简单地将5替换(覆盖)为10,再由finally块返回