2016-08-27 1 views
-4

愚かな質問私はscalaを学んでいます。私はinmutable valを使っているので、try/catchからvalを定義することはできません。この場合、通常の動作は何ですか?val変数をcatchで表示することを定義する

これは

try { 
    val jsonAlbum= new JSONObject(json.asInstanceOf[Map[String, Any]]) 
    val album = AlbumFactory.create(jsonAlbum) 
    albums = albums ++ List(album) 
    } catch { 
    case e: NoSuchElementException => { 
     println(s" Excewption adding alnum:$jsonAlbum")--> This val is not visible 
    } 

てみ

の外に定義されていないので、jsonAlbumはもちろん、私はVAR

+0

「lazy val jsonAlbum = ???」と同様にできます。 try {useJsonAlbumEvaledOnlyThere} catch {case e:Throwable => ??? } ' – cchantep

+0

これは機能していないように見えます。外側のスコープでjsonAlbumを定義し、作成中に例外をスローした場合はどうなりますか?JsonObject?ほとんどの場合、catchブロックには必要ありません。 –

答えて

3

can val jsonAlbum= new JSONObject(json.asInstanceOf[Map[String, Any]]) throw NoSuchElementException?そうでない場合は、try/catchブロックの前にjsonAlbumと宣言してください。はいの場合、作成に失敗したため、キャッチブロックに正しい値jsonAlbumが表示されません。

あなたは、コードのゴミなしでの視認性を維持したい場合は、

val a = try { ... } catch { ... } 

ようなものを使用することができます。

+0

愚かな私、あなたは正しい新しいJSONObjectは例外がスローされるかもしれないポイントではなかった – paul

1

それにヴァルを維持していないしたいと思いキャッチに表示されていない私のコードですブロック内のvalおよびvarは、catchブロックには表示されません。 javaと同じです。

データメンバーを表示する必要がある場合は、tryブロックの上に宣言する必要があります。あなたはそれがvalであれば再初期化できないことに注意してください。

var x: A = null 

try { 
    x = someThingBad() 
} catch { 
case ex => println(s"""$x""") 
} 
+0

私はそれを知っていましたが、それはrubishです、言語はこのために準備する必要があります – paul

関連する問題