Regex.MatchData returning null: why not Option[String]?
null, nullreferenceexception, scala
Solution
It returns null because it is a shallow interface over the Java library. I think it sucks too, and I have been bitten by it.
If you get a value that may be null, you can write `Option(value)` on Scala 2.8 and it will become either `None` or `Some(value)`. That doesn't work with pattern matching, but you can write your own extractor for that:
object Optional {
def unapply[T](a: T) = if (null == a) Some(None) else Some(Some(a))
}
Examples:
scala> val a:String = null
a: String = null
scala> a match {
| case Optional(None) => println("Got none")
| case Optional(Some(value)) => println("Got "+value)
| }
Got none
scala> val a = "string"
a: java.lang.String = string
scala> a match {
| case Optional(None) => println("Got none")
| case Optional(Some(value)) => println("Got "+value)
| }
Got string
scala> val a = "5"
a: java.lang.String = 5
scala> a match {
| case Optional(None) => println("Got none")
| case Optional(Some(value)) => println("Got "+value.toInt)
| }
Got 5
Problem
Is there any particular reason why Regex.MatchData.group(i: Int): java.lang.String returns null rather than Option[String]? Is there a "Scala Way" to handle nulls in Scala?