可能重複:
「return」 and 「try-catch-finally」 block evaluation in scala的最後返回值Scala中方框
有兩種Scala的功能:
一個):def foo(): Int = try { 1 } finally { 2 }
B):def bar(): Int = try { return 1 } finally { return 2}
我想不通爲什麼foo
返回1,但bar
返回2
可能重複:
「return」 and 「try-catch-finally」 block evaluation in scala的最後返回值Scala中方框
有兩種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.勺子和B.Venners。我有第一版和第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 }
調用克()的結果1.兩個這些函數表現出的行爲可能會讓大多數程序員感到驚訝,因此通常最好避免從
finally
子句返回值。
Scala的標準庫有scala.util.control.Exception
API,爲處理異常小的功能庫。請參閱scaladoc的示例
欄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
}