如果iterable不是';Scala中的t null?
我正在尝试从Play框架中的配置文件中检索服务器列表。目前我有以下代码:如果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
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]
结束,如果没有,则该选项为空