关于范围:Java – 如果我在catch块中返回,是否会执行finally块?

Java - If I return in a catch block, will the finally block be executed?

本问题已经有最佳答案,请猛点这里访问。

这就是我要做的:

1
2
3
4
5
6
7
8
9
10
try {

    //code
} catch (Exception e) {

    return false;
} finally {

    //close resources
}

这行吗?这是不好的做法吗?这样做更好吗:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
boolean inserted = true;

try {

    //code
} catch (Exception e) {

    inserted = false;
} finally {

    //close resources
}

return inserted;


是的,会的。唯一能阻止执行finally块(afair)的是System.exit()和无限循环(当然还有一个JVM崩溃)。


总是无条件地执行finally块,就像try-catch-finally块所做的最后一件事一样。即使对其执行Thread#stopfinally块仍将执行,就像发生了常规异常一样。

不仅如此,如果您从finally返回,该返回值将超过trycatch的返回值。

顺便说一句,你的第一个例子不仅是好的,而且是首选的。在第二个示例中,读者必须围绕变量的赋值进行搜索,这是一项繁琐的工作,可以很容易地让错误溜走。


两者大致相同。但是,注意以下情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int i = 0;

try
{
    //code
}
catch(Exception e)
{
    return i;
}
finally
{
    i = 1;
}

0是将要返回的。


我只是想补充一下,它在规范中有描述:

If the catch block completes abruptly for reason R, then the finally block is executed.

当然在哪

It can be seen, then, that a return statement always completes abruptly.