我怎样才能在try catch块中初始化val对象?

时间:2013-07-07 16:16:31

标签: scala

我在Scala中有这个代码,a对象应该是值而不是变量,如何初始化try块中的a对象?

object SomeObject {
  private val a : SomeClass

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

2 个答案:

答案 0 :(得分:21)

Scala尝试避免未定义/ null值。但是,如果try失败并使用整个a表达式初始化try,则可以通过为案例提供返回值来解决问题:

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

更新:在Scala中,使用scala.util中的Try可能更为惯用:

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使用部分函数从某些异常中恢复(并可能重用这些部分函数)。

答案 1 :(得分:3)

因为在Scala块中有返回值,并且最后一个表达式是默认值的返回值,所以可以这样做:

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检查。