scala.MatchError:scala上的null

时间:2016-12-23 21:01:45

标签: scala

我收到以下错误.. 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
  }
}

3 个答案:

答案 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旨在完全避免nullOption的内容永远不应该是null;相反,它应该是None。因此,你不应该做这种奇怪的舞蹈:

val a: Option[String] = company.customUrl match {
  case Some(a) => company.a
  case None => null
}

只需val a = company.customUrl即可。

这也可能是MatchError的原因。由于你的其他一些代码,company.customUrlcompany.bcompany.c中的一个或多个是null

重申: Option永远不应该是null 此外,在Scala中,始终尽量避免使用null并且更喜欢{ {1}}。