从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?