从 Java 中的最后一个块返回

2022-08-31 06:35:29

我最近惊讶地发现,在Java中,最终的块中可能有一个返回语句。

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

所以,我的问题是,任何人都可以给我一个例子,其中最终块中的返回语句(或其他流控制)产生更好/更易读的代码?


答案 1

几年前,我很难找到一个由此引起的错误。代码是这样的:

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

发生的事情是,异常在其他一些代码中被抛出。它被捕获,记录并在方法中重新抛出。但是这个例外并没有传播过去。经过长时间的观察,我们终于将其追踪到返回方法。finally 块中的返回方法基本上是阻止 try 块中发生的异常向上传播,即使它没有被捕获。somethingThatThrewAnException()problemMethod()

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


答案 2

您提供的示例足以说明最终不使用流控制。

即使有一个人为的例子,它“更好”,也要考虑一下开发人员,他以后必须维护你的代码,并且可能没有意识到其中的微妙之处。那个可怜的开发人员甚至可能就是你....