可能重复:
“return” and “try-catch-finally” block evaluation in scala
有两个Scala函数:
a):def foo(): Int = try { 1 } finally { 2 }
b):def bar(): Int = try { return 1 } finally { return 2}
我无法弄清楚为什么foo
会返回1,但bar
会返回2。
答案 0 :(得分:10)
M.Odersky,L。Spoon和B.Venners在“Scala编程”中解释了这种行为。我有第一版,第7.5节(第128页)说:
值得注意的是,Scala的行为与Java不同,因为Java的
try-finally
不会产生值。与在Java中一样,如果finally
子句包含显式返回语句或抛出异常,则该返回值或异常将“覆盖”源自try块或其catch子句之一的任何前一个。例如, 给出:
def f(): Int = try { return 1 } finally { return 2 }
调用f()会导致2.相反,给出:
def g(): Int = try { 1 } finally { 2 }
调用g()会导致1.这两个函数都表现出可能让大多数程序员感到惊讶的行为,因此通常最好避免从
finally
子句返回值。
Scala标准库具有scala.util.control.Exception
API,可提供用于处理异常的小型函数库。请参阅scaladoc
答案 1 :(得分:1)
bar()的finally块的return语句退出方法栏()。因此,不会返回try块的结果。
此示例显示了方法foo()和bar()的(大致)等效版本:
object Test extends App {
def foo() = {
val result = { 1 }
{ 2 }
result
}
def bar(): Int = {
val result = { 1 }
{ return 2 }
result // this line is not processed
}
println("foo = " + foo()) // foo = 1
println("bar = " + bar()) // bar = 2
}