如果iterable不是';Scala中的t null?

如果iterable不是';Scala中的t null?,scala,nullpointerexception,Scala,Nullpointerexception,我正在尝试从Play框架中的配置文件中检索服务器列表。目前我有以下代码: val servers: List[Server] = { val servers = ConfigFactory.load().getConfigList("servers") map { s => Server(s.getString("ip"), s.getString("port")) } servers.toList } 当配置文件中不存在“服务器”时,会出现问题。在这种情况下,Confi

我正在尝试从Play框架中的配置文件中检索服务器列表。目前我有以下代码:

val servers: List[Server] = {
  val servers = ConfigFactory.load().getConfigList("servers") map { s =>
    Server(s.getString("ip"), s.getString("port")) }
  servers.toList
}
当配置文件中不存在“服务器”时,会出现问题。在这种情况下,
ConfigFactory.load().getConfigList(“服务器”)==null
,因此
map
操作会导致
NullPointerException
。一个简单的解决方法是存储
ConfigFactory.load().getConfigList(“服务器”)
的结果,并根据其结果进行分支


我觉得这种方法不太习惯。如果前面的表达式不是
null
,是否有一种方法可以使我只能
map

import com.typesafe.config.ConfigFactory

//...

val server_list = ConfigFactory.load().getConfigList("servers")

val servers: List[Server] = server_list match {
  case null => List[Server]()
  case _ => val servers = server_list map { s =>
    Server(s.getString("ip"), s.getString("port")) }
  servers.toList
}

看起来您正在使用JavaAPI进行播放

play.api.Play.application.configuration.getConfigList
将调用
def
getConfigList(路径:String):选项[List[Configuration]]
,然后可以在其上使用getOrElse

server_list=ConfigFactory.load().getConfigList(“服务器”).getOrElse(list())


请注意,
play.api.play.application
已被弃用。正如OP所指出的,检索此值的新代码应该是
server\u list=ConfigFactory.load().getConfigList(“服务器”)

也许您可以尝试在第一次调用周围包装一个选项:

val server_list = Option(play.Play.application().configuration().getConfigList("servers"))

这应该返回None而不是null。然后可以使用.getOrElse(List.empty).map

刚刚找到
com.typesafe.config.ConfigFactory
,因此产生的更改应该是
val server\u list=ConfigFactory.load().getConfigList(“服务器”)
。我将在我的问题中更新此内容,然后删除此注释。很酷,还意识到您不能展平
选项[List[t]]
,但您可以使用
getOrElse(List())
List[t]
结束,如果没有,则该选项为空