愚蠢的问题我正在学习scala,我发现因为我使用了inmutable val我无法定义try / catch中的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在catch中不可见,因为未在try
中定义显然我想保留val而不是var
答案 0 :(得分:4)
可以val jsonAlbum= new JSONObject(json.asInstanceOf[Map[String, Any]])
抛出NoSuchElementException
吗?如果没有,只需在try / catch块之前声明jsonAlbum
。如果是的话,你无法在catch块中看到jsonAlbum
的正确值,因为它的创建失败了。
请注意,您可以使用
之类的内容val a = try { ... } catch { ... }
如果你想在没有代码垃圾的情况下保持可见性。
答案 1 :(得分:1)
val
块中的var
和try
s在catch
块中不可见。与java一样。
如果必须显示数据成员,则应在try block上面声明它们。请注意,如果是val,则无法重新初始化。
var x: A = null
try {
x = someThingBad()
} catch {
case ex => println(s"""$x""")
}