我收到以下错误.. scala.MatchError:null
我的代码有问题吗?如果是这样,我该如何解决?
val a : Option[String] = {
company.customUrl match {
case Some(a) => company.a
case None => null
}
}
val b :Option[String] = {
company.b match {
case Some(b) => company.b
case _ => null
}
}
val c : Option[Long] = {
company.c match {
case Some(c) => Option(company.c.get.toLong)
case _ => null
}
}
答案 0 :(得分:0)
a,b,c
的返回类型都是Òption
,但每个第二种情况下的原始类型null
都不是。请尝试返回None
。
a
第二种情况应该使用_
b
也可以简化为val b :Option[String] = company.b
答案 1 :(得分:0)
在第一种情况下,您必须为customUrl
设置空值:
scala> (null: Any) match { case Some(x) => x ; case None => ??? }
scala.MatchError: null
... 29 elided
最好尽快在Option中包装可以为空的值,而不是打开它们。特别是,不要将Options设置为null。
答案 2 :(得分:0)
Option
旨在完全避免null
。 Option
的内容永远不应该是null
;相反,它应该是None
。因此,你不应该做这种奇怪的舞蹈:
val a: Option[String] = company.customUrl match {
case Some(a) => company.a
case None => null
}
只需val a = company.customUrl
即可。
这也可能是MatchError
的原因。由于你的其他一些代码,company.customUrl
,company.b
或company.c
中的一个或多个是null
。
重申: Option
永远不应该是null
。 此外,在Scala中,始终尽量避免使用null
并且更喜欢{ {1}}。