4

可能重复:
scala中的“return”和“try-catch-finally”块评估

有两个 Scala 函数:

一个):def foo(): Int = try { 1 } finally { 2 }

b):def bar(): Int = try { return 1 } finally { return 2}

我无法弄清楚为什么foo返回 1 但bar返回 2。

4

2 回答 2

11

M.Odersky、L. Spoon 和 B.Venners 在“Scala 编程”中解释了这种行为。我有第一版,第 7.5 节(第 128 页)说:

值得注意的是,Scala 的行为与 Java 不同,只是因为 Javatry-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.ExceptionAPI 提供了用于处理异常的小型函数库。请参阅scaladoc中的示例

于 2012-12-15T14:51:52.240 回答
1

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

}
于 2012-12-15T14:50:09.957 回答