try / finally没有catch return语句?

时间:2016-01-11 15:01:11

标签: java exception return try-catch

为什么以下代码的结果为3,为什么最终得到终止并退出方法,即使编译器检查首先尝试以及为什么try中的返回不会终止该方法?

public int returnVal(){ 
    try{
        return 2;
    }
    finally{
        return 3;
    }
}

5 个答案:

答案 0 :(得分:5)

请参阅JLS 14.17

  

然后可以看出,return语句总是突然完成。

     

前面的描述说“尝试转移控制”而不仅仅是“转移控制”,因为如果在try块或者catch子句包含return语句的方法或构造函数中有任何try语句(§14.20),那么任何最终在将控制权转移给方法或构造函数的调用者之前,这些try语句的子句将按顺序执行,最内层到最外层。突然完成finally子句可能会破坏由return语句启动的控制权转移。

特别检查短语attempts to transfer control和最后一句。 try返回尝试转移controll,然后转发finally disrupt the transfer of control initiated by a return statement

换句话说,try attempts to transfer the controll,但由于finally块的执行仍然可以执行并且包含一个return语句,因此finally块中的controll的尝试传输具有更高的preceding 。这就是为什么你看到值3,它在finally块中返回。

答案 1 :(得分:4)

在从finally(或try)返回值之前执行

catch

如果在finally中存在return语句,则会覆盖try(或catch)块的返回。

所以在这种情况下,最终获胜的回报:

try {
    // Exception thrown
    return 2;
} catch (Exception e) {
    return 1;
} finally {
    return -1;   // Always returns -1 also if a return statement is present in the try and in the catch clause
}

答案 2 :(得分:1)

  

为什么try中的返回不会终止方法?

Is it bad practice to return from within a try catch finally block?

您必须知道,当您在try-catch语句中放置一个返回时,返回本身由exeption处理块保存和管理。

异常块仅存储您的返回并且仅在完成所有验证后才返回它,这并不意味着finally块将对您的返回产生影响:

public int returnVal() { 
    int i = 0;
    try {
        return i;
    }
    finally {
        i = 99;
    }
}

在这种情况下,返回仍为0。

但是如果你在问题中提到过,你会第二次影响回报,并且由于例外区块不想让你的回报继续进行,直到完成所有的验证,你和#39;只需在异常块中存储2次返回值。结果总是3。

请记住,如果你在一个try-catch-finally中放一个返回,那么返回将不会返回,直到最后一个块运行;返回本身只是存储,直到所有内容都经过验证。

答案 3 :(得分:0)

https://youtu.be/Ne2uHFi_e_M?t=41s当你写一个 finnaly 块时,它们总是执行它。

答案 4 :(得分:0)

在将控制权返回给调用函数之前,始终执行finally块。 所以在这种情况下,在返回2之前,它将最终调用并返回3.