2012-12-15 31 views

回答

10

此行爲是由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的示例

0

欄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 

}