我在我的scala代码中使用spson json deserialize中的代码片段。 https://github.com/spray/spray-json
import spray.json._
import DefaultJsonProtocol._
object MyJsonProtocol extends DefaultJsonProtocol {
implicit object RoundedDoubleJsonWriter extends JsonWriter[Double] {
def write(d: Double) =
JsNumber(BigDecimal(d).setScale(4, BigDecimal.RoundingMode.HALF_UP))
}
}
import MyJsonProtocol._
scala> val d = 1234.8473245.toJson
json: spray.json.JsValue = 1234.8473
当我在命令提示符下执行它时,我没有得到任何异常但是在执行完整的scala代码时获取NumberFormatException。
ERROR JobManagerActor: [akka://JobServer/user/jobManager-eb-a124-c7330743f884] - Got Throwable
java.lang.NumberFormatException
at java.math.BigDecimal.<init>(BigDecimal.java:494)
at java.math.BigDecimal.<init>(BigDecimal.java:824)
at scala.math.BigDecimal$.decimal(BigDecimal.scala:52)
at scala.math.BigDecimal$.apply(BigDecimal.scala:249)
请举例说明重现上述异常并解决技术问题?
我在与它相关的堆栈溢出中发现了一些问题,并尝试重现上述异常。
scala> val a = BigDecimal("0")
a: scala.math.BigDecimal = 0
scala> val a = BigDecimal("0 ")
java.lang.NumberFormatException
at java.math.BigDecimal.<init>(BigDecimal.java:494)
at java.math.BigDecimal.<init>(BigDecimal.java:383)
at java.math.BigDecimal.<init>(BigDecimal.java:806)
at scala.math.BigDecimal$.exact(BigDecimal.scala:125)
at scala.math.BigDecimal$.apply(BigDecimal.scala:283)
... 43 elided
但它不会对上面的代码抛出任何异常。
答案 0 :(得分:1)
此问题是由以下原因造成的:def write(d: Double) =
,t
的值为Double.NaN
,当BigDecimal
转换为此时,NumberFormatException
被投掷即可。再现:
def main(args: Array[String]): Unit = {
val t: Double = Double.NaN
convert(t)
}
def convert(d: Double): BigDecimal = {
println(java.lang.Double.toString(d))
BigDecimal(d)
}
对于解决方案,我想也许你可以在得到它时处理Double.NaN
。