2013-07-07 57 views
5

我在Scala中有這樣的代碼,a對象應該是值不是變量,我怎樣才能在try塊中初始化a對象?我怎麼能初始化try catch塊中的val對象?

object SomeObject { 
    private val a : SomeClass 

    try { 
    a=someThing // this statement may throw an exception 
    } 
    catch { 
    case ex: Exception=> { 
     ex.printStackTrace() 
    } 
    } 
} 
+2

如果'try'失敗,'a'的值應該是多少? –

+0

@TheTerribleSwiftTomato我會爲null或未定義的東西。我只是想在try catch中初始化它們,因爲賦值可能會拋出異常 – Pooya

+0

@TheTerribleSwiftTomato喜歡打開文件流 – Pooya

回答

16

Scala試圖避免undefined/null值。但是,您可以通過給返回值如果try失敗的情況下,並與整個try表達初始化a解決的問題:

private val a: SomeClass = 
    try { 
    someThing // this statement may throw an exception 
    } catch { 
    case ex: Exception => { 
     ex.printStackTrace() 
     someDefault 
    } 
    } 

更新:在斯卡拉那就可能更習慣使用Tryscala.util

val x : Int = 
    Try({ 
    someThing 
    }).recoverWith({ 
    // Just log the exception and keep it as a failure. 
    case (ex: Throwable) => ex.printStackTrace; Failure(ex); 
    }).getOrElse(1); 

Try允許您撰寫的計算,可以失敗,並以各種方式異常。舉例來說,如果你有Try類型的兩個計算可以撥打

thing1.orElse(thing2).getOrElse(someDefault) 

這將運行thing1並返回其結果,如果它是成功的。如果失敗,則繼續thing2。如果它也失敗,則返回someDefault。您也可以使用recoverrecoverWith從部分函數中恢復某些異常(並可能重用這些部分函數)。

+0

我沒有找到在scala.util包中試用。你的Scala版本是什麼? – Pooya

+1

'Try'自2.10開始提供:http://www.scala-lang.org/api/current/index.html#scala.util.Try –

+0

+1更新中的精彩信息。 –

3

由於在斯卡拉塊有返回值,最後表達爲每默認的返回值,你可以這樣做:

object SomeObject { 
    private val a : SomeClass = { //this additional block not necessary, but added for clarity 
     try { 
     someThing // this statement may throw an exception 
     } 
     catch { 
     case ex: Exception=> { 
      ex.printStackTrace() 
      null 
     } 
     } 
    } 
} 

。但是,我必須補充一點,這看起來像是在試圖完成一些可能會在後面炸燬的東西 - 您需要在使用該值的任何代碼中檢查null

+1

Scala是一種很棒的語言 – Pooya