Scala NumberFormatException при преобразовании строки в длинную? - PullRequest
2 голосов
/ 11 февраля 2012

Наше приложение основано на Scala и построено на Play!фреймворк.Я сгенерировал случайное число с помощью Scala Random.Это используется в качестве уникального ключа для каждой учетной записи в нашем приложении.

Однако, когда я сохраняю новую учетную запись в базе данных, она выдает java.lang.NumberFormatException:

Подробнее: Я конвертирую строку идентификатора аккаунта в Scala Long.Я искал его с помощью объекта Squeryl, захватывая ID, а затем конвертировал его.Вот как это выглядит:

val account_id = Account.findAccountByUnique(account.uniqueKey).id.toLong

Вот как выглядит findAccountByUnique:

def findAccountByUnique(criteria: String) = {
    from(DB.accounts)(a =>
      where(a.uniqueKey == criteria)
        select (a))
  }

Трассировка стека при ошибке:

java.lang.NumberFormatException: For input string: "468b68c"
        at java.lang.NumberFormatException.forInputString(Unknown Source)
        at java.lang.Long.parseLong(Unknown Source)
        at java.lang.Long.parseLong(Unknown Source)
        at scala.collection.immutable.StringLike$class.toLong(StringLike.scala:209)
        at scala.collection.immutable.StringOps.toLong(StringOps.scala:31)
        at controllers.Accounts$.save(Accounts.scala:44)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548)
        at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)
        at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:496)
        at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473)
        at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
        at play.server.PlayHandler$NettyInvocation.execute(PlayHandler.java:257)
        at play.Invoker$Invocation.run(Invoker.java:278)
        at play.server.PlayHandler$NettyInvocation.run(PlayHandler.java:235)
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(Unknown Source)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

Я набрал уникальный ключ как Scala Long и String, но он выдает ту же ошибку.Любая идея, как исправить?

Ответы [ 3 ]

5 голосов
/ 11 февраля 2012

Чтобы преобразовать шестнадцатеричное число в десятичное, существует java.lang.Long.parseLong:

scala> import java.lang.{ Long => JLong }
import java.lang.{Long=>JLong}

scala> JLong.parseLong("468b68c", 16)
res8: Long = 73971340

Другой способ преобразовать шестнадцатеричное в десятичное - написать собственный метод:

def toHex(s: String): Long = {
  val Hex = "([0-9a-fA-F]+)".r
  s match {
    case Hex(_) => java.lang.Long.parseLong(s, 16)
    case _ => throw new NumberFormatException("invalid hex number: " + s)
  }
}
0 голосов
/ 18 февраля 2012

После дальнейшего исследования похоже, что был помощник базы данных, возвращающий ненужные данные. По сути, он фактически возвращал свои собственные «выборочные» данные, которые оказались шестнадцатеричными. В Squeryl это была либа, похоже, что-то где-то искажено, и поэтому это вызвало «примерный» ответ.

Похоже, потому что account.uniqueKey был обновлен по предыдущему запросу, это принесло с собой немного мусора. Все еще исследую, как это произошло, но, по крайней мере, я нашел настоящую проблему.

0 голосов
/ 11 февраля 2012

Идентификатор в шестнадцатеричном формате, поэтому вам нужно

val account_id = Account.findAccountByUnique(account.uniqueKey).id.toLong(16)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...