2017-01-11 92 views
0

我在我的Scala代碼中使用了噴霧json反序列化中的代碼片段。 https://github.com/spray/spray-json如何產生BigDecimal NumberFormatException並解決它?

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 

但它沒有拋出上述代碼的任何異常。

回答

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當你得到它。

相關問題