なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

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                 

以下のサイトが参考になりそうだ

yuroyoro.hatenablog.com