一尘不染

从Java中的finally块返回

java

近我很惊讶地发现,在Java的finally块中可能有一个return语句。

似乎很多人都认为这是一件坏事,如“ 不要在finally子句中返回”中所述。更深入地研究,我还发现“ Java的回报并不总是 ”,这在finally块中显示了其他类型的流控制的一些非常可怕的示例。

因此,我的问题是,谁能给我一个示例,其中finally块中的return语句(或其他流控制)产生更好/更具可读性的代码吗?


阅读 464

收藏
2020-03-02

共2个答案

一尘不染

你提供的示例足够有理由从头开始不使用流控制。

即使有一个“更好”的人为设计示例,也请考虑必须稍后维护你的代码并且可能不知道其细微之处的开发人员。那个可怜的开发者甚至可能就是你。

2020-03-02
一尘不染

我很难找到一个由此引起的错误。代码类似于:

Object problemMethod() {
    Object rtn = null;
    try {
        rtn = somethingThatThrewAnException();
    }
    finally {
        doSomeCleanup();
        return rtn;
    }
}

发生的事情是该异常已在其他一些代码中抛出。该方法被捕获并记录并重新抛出somethingThatThrewAnException()。但是例外并没有被传播过去problemMethod()。经过长时间的研究,我们终于将其归结为return方法。最终块中的return方法基本上是阻止try块中发生的异常传播,即使未被捕获。

就像其他人所说的那样,虽然根据Java规范从finally块返回是合法的,但这是一件不好的事情,不应该这样做。

2020-03-02