【问题标题】:GAE JCache NumberFormatException, will I need to write Java to avoid?GAE JCache NumberFormatException,我需要编写Java来避免吗?
【发布时间】:2010-04-18 11:42:01
【问题描述】:

下面的代码在这一行中产生一个 NumberFormatException:

val cache = cf.createCache(Collections.emptyMap())

您是否发现任何错误?
我需要write a Java version 来避免这种情况,还是有 Scala 方式?

...
import java.util.Collections
import net.sf.jsr107cache._

object QueryGenerator extends ServerResource {
  private val log = Logger.getLogger(classOf[QueryGenerator].getName)
}

class QueryGenerator extends ServerResource {
  def getCounter(cache:Cache):long = {
      if (cache.containsKey("counter")) {
        cache.get("counter").asInstanceOf[long]
      } else {
        0l
      }
    }

  @Get("html")
  def getHtml(): Representation = {
    val cf = CacheManager.getInstance().getCacheFactory()
    val cache = cf.createCache(Collections.emptyMap())

    val counter = getCounter(cache)

    cache.put("counter", counter + 1)

    val q = QueueFactory.getQueue("query-generator")
    q.add(TaskOptions.Builder.url("/tasks/query-generator").method(Method.GET).countdownMillis(1000L))

    QueryGenerator.log.warning(counter.toString)

    new StringRepresentation("QueryGenerator started!", MediaType.TEXT_HTML)
  }
}

谢谢!

【问题讨论】:

    标签: java google-app-engine scala memcached restlet


    【解决方案1】:

    我怀疑异常确实发生在对getCounter 的调用中。 NumberFormatException 当您尝试将字符串转换为数字时抛出NumberFormatException,并且该字符串不包含可识别的数字。

    【讨论】:

      【解决方案2】:

      我现在添加了一个用于放置/更新的小型 Java 类。不是最优雅的解决方案,但它有效。 Scala 解决方案仍将受到赞赏。

      Java:

      import javax.cache.Cache;
      
      public class CacheHelper {
          public static final void update(Cache cache,String key,Object value) {
              cache.put(key,value);
          }
      }
      

      斯卡拉:

      import java.util.Collections
      import javax.cache.CacheManager
      import somewhere.CacheHelper
      
      object QueryGenerator extends ServerResource {
        private val log = Logger.getLogger(classOf[QueryGenerator].getName)
      }
      
      class QueryGenerator extends ServerResource {
      
        @Get("html")
        def getHtml(): Representation = {
          val cf = CacheManager.getInstance().getCacheFactory()
          val cache = cf.createCache(Collections.emptyMap())
      
          val counter = if (cache.containsKey("counter")) {
            cache.get("counter").asInstanceOf[Int]
          } else {
            0
          }
      
          CacheHelper.update(cache,"counter",counter+1)
      
          val q = QueueFactory.getQueue("query-generator")
          q.add(TaskOptions.Builder.url("/tasks/query-generator").method(Method.GET).countdownMillis(1000L))
      
          QueryGenerator.log.warning(counter.toString())
      
          new StringRepresentation("QueryGenerator started!", MediaType.TEXT_HTML)
        }
      }
      

      【讨论】:

      • 您的两段代码不等价——一个使用Long,另一个使用Int,并且您更改了导入。此外,您用 Java 重写了一行似乎与崩溃无关的代码。如果你在 Scala 中将 CacheHelper 写成一个对象,它会做与它崩溃完全相同的事情,你确定吗? (即object CacheHelper { def update ... }。)如果是这样,那就太奇怪了。
      • 我没有写对象,但在QueryGenerator类中有方法。它已经产生了一些错误[这里提到][k]。很抱歉导入和类型不一致。在此期间,我只是玩了很多。 [k]:stackoverflow.com/questions/1657494/…
      猜你喜欢
      • 1970-01-01
      • 2019-11-24
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多