有两个 Scala 函数:
一个):def foo(): Int = try { 1 } finally { 2 }
b):def bar(): Int = try { return 1 } finally { return 2}
我无法弄清楚为什么foo
返回 1 但bar
返回 2。
有两个 Scala 函数:
一个):def foo(): Int = try { 1 } finally { 2 }
b):def bar(): Int = try { return 1 } finally { return 2}
我无法弄清楚为什么foo
返回 1 但bar
返回 2。
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中的示例
bar() 的 finally 块的 return 语句退出了 bar() 方法。因此不返回 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
}