15

Scala でこのコードを使用しています。オブジェクトは変数ではなく値である必要があります。try ブロックでオブジェクトaを初期化するにはどうすればよいですか?a

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 は未定義/null 値を回避しようとします。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さまざまな方法で例外で失敗する可能性のある計算を作成できます。たとえば、タイプの計算が 2 つある場合は、次のようにTry呼び出すことができます。

thing1.orElse(thing2).getOrElse(someDefault)

これが実行thing1され、成功した場合は結果が返されます。失敗した場合は、 に進みthing2ます。それも失敗した場合は、 を返しますsomeDefaultrecoverまたはを使用して、部分関数を使用して一部の例外から回復することもできrecoverWithます (これらの部分関数を再利用する可能性もあります)。

于 2013-07-07T16:32:21.063 に答える
4

In 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 に答える