在catch上定义val变量可见

时间:2016-08-27 11:32:33

标签: scala

愚蠢的问题我正在学习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

2 个答案:

答案 0 :(得分:4)

可以val jsonAlbum= new JSONObject(json.asInstanceOf[Map[String, Any]])抛出NoSuchElementException吗?如果没有,只需在try / catch块之前声明jsonAlbum。如果是的话,你无法在catch块中看到jsonAlbum的正确值,因为它的创建失败了。

请注意,您可以使用

之类的内容
val a = try { ... } catch { ... }

如果你想在没有代码垃圾的情况下保持可见性。

答案 1 :(得分:1)

val块中的vartry s在catch块中不可见。与java一样。

如果必须显示数据成员,则应在try block上面声明它们。请注意,如果是val,则无法重新初始化。

var x: A = null

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