以下两个代码会产生不同的结果:
def x = try{
true
} finally false
调用x获取true
def y:Boolean = try{
return true
} finally {
return false
}
调用y获取false
return
版本的行为与Java相同。
我个人从不在scala中使用'return'。但是知道scala如何评估try-catch-finally块的值是很好的。感谢。
答案 0 :(得分:13)
你should not在finally块中有一个return语句(即使在技术上允许,至少在Java中,C#例如禁止它)。
如果Scala finally块有隐式返回,那么总是会破坏预期的返回值。所以这没有意义。
但是,如果你明确地这样写的话,我想它无法帮助你。
答案 1 :(得分:9)
根据Scala语言规范:
尝试表达式try {b}最后e计算块b。如果评价b 不会引发异常,评估表达式e。如果是例外 在评估e期间抛出,对try表达式的评估被中止 抛出异常。如果在评估e期间没有抛出异常,那么 b的结果作为try表达式的结果返回。
这种行为似乎与该规范相矛盾。我猜想,因为'return'会立即从函数返回,这会导致覆盖try块的标准行为。一个有启发性的例子是:
def z : Boolean = {
val foo = try { true } finally { return false }
true
}
调用z
会返回false
。