从Java中的finally块返回

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

看起来好像很多人认为按照'不要在最后一个条款中返回'中描述的那样做是件坏事。 深入研究一下,我还发现'Java的回归并不总是这样',它显示了最终块中其他类型流量控制的一些非常可怕的例子。

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


你提供的例子是足够的理由,不能从最后使用流控制。

即使有一个人为的例子,它“更好”,考虑一下开发者必须稍后维护你的代码,并且可能不知道这些微妙之处。 那个可怜的开发者甚至可能是你......


我真的很难找到几年前由此造成的错误。 代码是这样的:

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

发生什么事是这个异常是在其他代码中抛出的。 它正在被somethingThatThrewAnException()方法捕获并记录并重新生成。 但是这个异常并没有通过problemMethod()传播problemMethod() 。 经过很长时间的研究后,我们终于追踪到了返回方法。 finally块中的return方法基本上阻止了try块中发生的异常,即使它没有被捕获也不会传播。

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


最后,如果你最后使用-Xlint,javac会提示返回。 最初的javac没有发出任何警告 - 如果代码有问题,它应该编译失败。 不幸的是,向后兼容意味着不可能禁止意料不到的愚蠢行为。

例外可以从finally块中抛出,但在这种情况下,展现的行为几乎肯定是你想要的。

链接地址: http://www.djcxy.com/p/12799.html

上一篇: Returning from a finally block in Java

下一篇: Java += operator?