Scala警告匹配可能并非详尽无遗

时间:2014-12-30 16:36:19

标签: scala compiler-warnings

我对Scala有点新鲜。以下是我的代码。

Option(Session.get().getAttribute("player")) match {
  case None => {
    val player = new Player(user.getEmail, user.getNickname).createOrGet
    Session.get().setAttribute("player", player)
  }
}

编译时我收到以下警告

Warning:(35, 11) match may not be exhaustive.
It would fail on the following input: Some(_)
    Option(Session.get().getAttribute("player")) match {
          ^

我该如何解决这个问题?有没有办法重写代码以避免警告?(我使用的是Scala版本2.10.2)

3 个答案:

答案 0 :(得分:10)

在模式匹配时,您应考虑所有可能的情况或提供"后备" (case _ => ...)。 Option可以是SomeNone,但您只能与None案例进行匹配。

如果Session.get().getAttribute("player")返回Some(player),您将获得MatchError(例外)。

由于您的代码似乎没有返回任何内容,我会在没有match的情况下重新编写此代码,只需检查isEmpty

if(Option(Session.get().getAttribute("player")).isEmpty) {
    val player = new Player(user.getEmail, user.getNickname).createOrGet
    Session.get().setAttribute("player", player)
}

虽然这与检查Session.get().getAttribute("player") == null非常不同。

答案 1 :(得分:3)

您只匹配案例None,更正确的方法是匹配Some(something)案例。 Option(...)可能会产生NoneSome(_),因此会出错。

在这种情况下,您尝试做的更好的解决方案就是:

if(Session.get().getAttribute("player") == null){
    val player = new Player(user.getEmail, user.getNickname).createOrGet
    Session.get().setAttribute("player", player)
}

答案 2 :(得分:1)

您需要包含Some案例:

Option(Session.get().getAttribute("player")) match {
  case Some(value) => // do something here
  case None => {
    val player = new Player(user.getEmail, user.getNickname).createOrGet
    Session.get().setAttribute("player", player)
  }
}