scala future 空指针匹配错误
scala future null pointer match error
scala futures 的新手我尝试调用类似
的网络服务
wsClient.url(baseUrl + url).withHeaders("Content-Type" -> "application/json").post(dataForR).flatMap(parseOutlierResponse)
使用 ply-ws
库
我验证并映射响应如下https://gist.github.com/geoHeil/943a18d43279762ad4cdfe9aa2e40770
主要是:
Await.result(callAMethodCallingTheFirstSnippet, 5.minutes)
奇怪的是,这个 在 repl 中工作得很好。但是,如果通过 sbt run
运行,我会得到 NullPointer 异常。我已经手动验证了 JSON 响应。它验证起来轻而易举。甚至映射也很好用。不过,肯定是我用的future有问题。但我不确定出了什么问题。似乎 flatMap 方法被调用之前 已经有一个结果。
有趣的是,如果我不等待结果没有空指针异常,但解析的结果显示正确(但是,程序不会退出)。但是在那里,我真正使用这段代码的地方,我不知何故需要等待成功完成才能进一步处理它。
下面是问题的说明
我没有发现您的代码有任何重大问题!我用下面的代码位做了一个小测试,它似乎在 REPL 和使用 sbt 运行:
时都运行良好
WS.clientUrl(s"http://$hostName/api/put").withHeaders(jsonHeaders: _*).post(body).map { r =>
if (r.status >= 400)
logger.warn(s"Invalid http response status: ${r.status} \n ${r.body}")
else
logger.debug(s"Successfully persisted data. Http response ${r.status}")
}
经过越来越多的调试,我发现一些隐式在错误的范围内,依赖大小写的顺序是错误的-类。将它们移动到正确的范围(执行请求的方法)后,空指针异常得到修复。
我从flatmap
改成map
后才发现"real"错误,我觉得很奇怪。但是,现在这两种方法都可以正常工作。
scala futures 的新手我尝试调用类似
的网络服务wsClient.url(baseUrl + url).withHeaders("Content-Type" -> "application/json").post(dataForR).flatMap(parseOutlierResponse)
使用 ply-ws
库
我验证并映射响应如下https://gist.github.com/geoHeil/943a18d43279762ad4cdfe9aa2e40770
主要是:
Await.result(callAMethodCallingTheFirstSnippet, 5.minutes)
奇怪的是,这个 在 repl 中工作得很好。但是,如果通过 sbt run
运行,我会得到 NullPointer 异常。我已经手动验证了 JSON 响应。它验证起来轻而易举。甚至映射也很好用。不过,肯定是我用的future有问题。但我不确定出了什么问题。似乎 flatMap 方法被调用之前 已经有一个结果。
有趣的是,如果我不等待结果没有空指针异常,但解析的结果显示正确(但是,程序不会退出)。但是在那里,我真正使用这段代码的地方,我不知何故需要等待成功完成才能进一步处理它。
下面是问题的说明
我没有发现您的代码有任何重大问题!我用下面的代码位做了一个小测试,它似乎在 REPL 和使用 sbt 运行:
时都运行良好 WS.clientUrl(s"http://$hostName/api/put").withHeaders(jsonHeaders: _*).post(body).map { r =>
if (r.status >= 400)
logger.warn(s"Invalid http response status: ${r.status} \n ${r.body}")
else
logger.debug(s"Successfully persisted data. Http response ${r.status}")
}
经过越来越多的调试,我发现一些隐式在错误的范围内,依赖大小写的顺序是错误的-类。将它们移动到正确的范围(执行请求的方法)后,空指针异常得到修复。
我从flatmap
改成map
后才发现"real"错误,我觉得很奇怪。但是,现在这两种方法都可以正常工作。