2013-07-07 12 views
5

Ho questo codice in Scala, a l'oggetto dovrebbe essere il valore non una variabile, Come posso inizializzare l'oggetto a nel blocco try?Come è possibile inizializzare l'oggetto val nel blocco catch try?

object SomeObject { 
    private val a : SomeClass 

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

Quale dovrebbe essere il valore di 'a' se il' try' fallisce? –

+0

@TheTerribleSwiftTomato Sarò null o qualcosa di indefinito. Voglio solo inizializzarli nel try catch, perché l'assegnazione può generare un'eccezione – Pooya

+0

@TheTerribleSwiftTomato Come aprire un flusso di file – Pooya

risposta

16

Scala tenta di evitare valori non definiti/nulli. Tuttavia, è possibile risolvere il problema dando valori di ritorno per i casi se il try non riesce e l'inizializzazione a con tutta try espressione:

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

Aggiornamento: In Scala, sarebbe probabilmente più idiomatica da utilizzare Try da scala.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 consente di comporre i calcoli che possono danneggiarsi con un'eccezione in vari modi. Ad esempio, se si hanno due calcoli di tipo Try è possibile chiamare

thing1.orElse(thing2).getOrElse(someDefault) 

Questo viene eseguito thing1 e restituisce il suo risultato, se è successo. Se fallisce, continua con thing2. Se fallisce anche, restituisce someDefault. È inoltre possibile utilizzare recover o recoverWith per ripristinare da alcune eccezioni l'uso di funzioni parziali (e potenzialmente riutilizzare quelle funzioni parziali).

+0

Non ho trovato Prova nel pacchetto scala.util. Qual è la tua versione di scala? – Pooya

+1

'Try' è disponibile dal 2.10: http://www.scala-lang.org/api/current/index.html#scala.util.Try –

+0

+1 Bel pezzo di informazioni nell'aggiornamento. –

3

Dal momento in blocchi Scala hanno valori di ritorno, e l'ultima espressione è il valore di ritorno per impostazione predefinita, si può fare questo:

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 
     } 
     } 
    } 
} 

. Tuttavia, devo aggiungere che sembra che tu stia cercando di realizzare qualcosa che potrebbe esplodere in un secondo momento: avrai bisogno dei controlli null in qualsiasi codice che utilizzi il valore.

+1

Scala è un'ottima lingua – Pooya

Problemi correlati