Java尝试最终返回devise问题

在Java中,try {…} finally {…}对我来说有点不直观。 如另一个问题所示, 最终总是在Java中执行? ,如果在try块中有return语句,那么如果定义了finally块,它将被忽略。 例如,function

boolean test () { try { return true; } finally { return false; } } 

将永远返回假。 我的问题:这是为什么? Java的这个devise决策背后有一个特定的哲学吗? 感谢任何见解,谢谢。

编辑:我特别感兴趣的是为什么Java认为可以违反我定义的语义。 如果我在一个try块中返回,那么这个方法应该会在那里返回。 但JVM决定忽略我的指令,并从实际上尚未达到的子程序返回。

从技术上讲,如果定义finally块,那么try块中的return不会被忽略,只有在finally块中也包含return

这是一个可疑的devise决策, 可能是一个回顾过程中的错误(很像引用是默认可空/可变的,并根据一些,检查exception)。 在许多方面,这种行为与对finally意义的口语理解是完全一致的 – “不pipe事先在try块中发生了什么,总是运行这个代码”。 因此,如果你从一个finallyreturn true ,总体效果必须总是返回true,否?

一般来说,这是一个很好的习惯用法,你应该使用finally块来清理/closures资源,但是很less从它们那里返回一个值。

如果finally块中的代码突然结束,它会从try块中改变返回值/exception。 这被认为是不好的做法,你不应该这样做。

在其他地方,这也在Java Puzzlers书中讨论。

finally构造是由JLS提供的用于处理容易出现某种exception的代码的工具。 开发者可以利用这个工具来确保从exception中恢复正常。 以你所描述的方式来使用finally构造并不是一个好的做法。 对于这个问题,从finally块return任何东西都是不好的。
所以如你所见,“ 哲学 ”就是处理任何突然完成的代码。 如果返回一个特定的值作为处理这种状态的一部分是必需的,那应该在catch块内完成。

如果使用-Xlint调用javac,则会生成一个适当的警告,指示不应该从finally子句调用返回值。 例如(用上面的test()方法编译一个简单的类):

 javac -Xlint foo.java foo.java:13: warning: [finally] finally clause cannot complete normally } ^ 1 warning 

检查这个参考最后总是执行在Java?

“一个try语句和一个finally块是通过首先执行try块来执行的,然后有一个select:
如果try块的执行正常完成,
如果try块的执行由于抛出一个值V而突然完成,
如果try块的执行由于其他原因R而突然完成,则执行finally块。 那么有一个select:
如果finally块正常完成,那么由于原因R,try语句突然完成。
如果finally块由于S原因而突然完成,那么try语句为S原因突然完成(并且原因R被丢弃)。

尽pipefinally块是为了closures资源而做的,并且返回语句通常不应该存在,Eclipse会警告“finally块没有正常完成”,但是在某些情况下我发现“finally return”仍然是可取的。

 ResponseType response = new ResponseType(); try{ //set some properties of the response object. response.setStatus(1); //return response; }catch (Exception e){ //Some other properties of the response object according to the exception. response.setStatus(0); //return response; }finally{ return response; } 

如果我没有在finally块中放置return子句,我将不得不在try和catch块中重复它,而且当前的代码更清晰一些。