15

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

object SomeObject {
  private val a : SomeClass

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

2 回答 2

25

Scala 试图避免未定义/空值。但是,您可以通过在try失败时为案例提供返回值并a使用整个try表达式进行初始化来解决问题:

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

更新:Try在 Scala 中,使用from可能更惯用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允许您以各种方式组合可能因异常而失败的计算。例如,如果您有两个类型的计算,Try您可以调用

thing1.orElse(thing2).getOrElse(someDefault)

thing1如果成功,它将运行并返回其结果。如果失败,则继续thing2。如果它也失败了,返回someDefault. 您还可以使用部分函数来使用recoverrecoverWith从某些异常中恢复(并可能重用这些部分函数)。

于 2013-07-07T16:32:21.063 回答
4

由于在 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检查任何使用该值的代码。

于 2013-07-07T16:31:29.373 回答