ScalaのSomeを使ってJavaのメソッドを呼び出すとき
正しい値・例外・nullという3値が返る可能性があるとき
scala.util.control.Exception.allCatch
を使えばいいのでは、と思ったが allCatch.opt { 式 } と書くと、式がnullの場合Some(null)というバッドな感じになる(なぜ?)。
allCatch.optを使った時の3値の型は以下の通り
$ scala Welcome to Scala version 2.9.2 (OpenJDK 64-Bit Server VM, Java 1.7.0_85). scala> :type scala.util.control.Exception.allCatch.opt { null } :type scala.util.control.Exception.allCatch.opt { null } Option[Null] scala> :type scala.util.control.Exception.allCatch.opt { throw new Exception } :type scala.util.control.Exception.allCatch.opt { throw new Exception } Option[Nothing] :type scala.util.control.Exception.allCatch.opt { 100 } Option[Int] // ぐぬぬ scala> scala.util.control.Exception.allCatch.opt { null } match { case Some(value) => true; case None => false } Boolean = true
なので allCatch { Option( 式 ) } と書いてみる。
とりあえずこれでnullはNoneで返ってくるし、ExceptionもNoneで返るはず。
scala> scala.util.control.Exception.allCatch { Option(null) } match { case Some(value) => false; case None => true; } value) => false; case None => true; } res1: Boolean = true
以下のサイトが参考になりそうだ