这就是我要做的:
try {
//code
} catch (Exception e) {
return false;
} finally {
//close resources
}
这行得通吗?这是不好的做法吗?这样做会更好吗:
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#stop
,finally
块仍将执行,就像发生了常规异常一样。
不仅如此,如果您从finally
返回,则该返回值将践踏try
或catch
的返回值。
BTW你的第一个例子不仅很好,而且更受欢迎。在第二个例子中,读者必须四处寻找变量的赋值,这是一项乏味的工作,很容易让bug溜走。
两者大致相同。但是,要小心以下情况:
int i = 0;
try
{
//code
}
catch(Exception e)
{
return i;
}
finally
{
i = 1;
}
将返回0
。
我只是想补充一下,它在规范中有描述:
如果catch块由于原因R而突然完成,则执行finally块。
当然
由此可见,return语句总是突然完成。