【问题标题】:Cats Future Monad giving runtime exceptionCats Future Monad 给出运行时异常
【发布时间】:2018-01-17 10:12:40
【问题描述】:
import cats.Monad
import cats.instances.future._
import scala.concurrent._
import scala.concurrent.duration._

import scala.concurrent.ExecutionContext.Implicits.global

val fm = Monad[Future]

Await.result(
  fm.flatMap(fm.pure(1)) {
    x => fm.pure(x+2)
  }, 1.second
)

这给了我一个运行时异常,我不明白为什么。我正在使用 scala 版本 2.12.2 和猫版本cats-core_2.12

java.lang.NoClassDefFoundError: 无法初始化类 $line9.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$ 在 scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:302) 在 scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:37) 在 scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60) 在 scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:140) 在 java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) 在 java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) 在 java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) 在 java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) java.util.concurrent.TimeoutException:期货在 [1 之后超时 第二]在 scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:255) 在 scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:259) 在 scala.concurrent.Await$.$anonfun$result$1(package.scala:215) 在 scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53) 在 scala.concurrent.Await$.result(package.scala:142) ... 43 省略

【问题讨论】:

    标签: scala monads future scala-cats


    【解决方案1】:

    这是由于 repl 中的错误

    https://github.com/scala/bug/issues/9076

    在 sbt 控制台中运行代码可以正常工作。

    import scala.concurrent._
    import scala.concurrent.duration._
    import cats.Monad
    import cats.instances.future._
    import scala.concurrent.ExecutionContext.Implicits.global
    
    object Test extends App {
      println("Inside test")
      val fm = Monad[Future]
      val x = Await.result(
        fm.flatMap(fm.pure(1)) {
          x => fm.pure(x+2)
        }, 1.second
      )
      println(x)
    }
    

    【讨论】:

      【解决方案2】:

      这些错误通常意味着您的依赖项中有同一个库的两个非二进制兼容版本。尝试运行 sbt evicted 并查看是否有任何 cats-core 版本被驱逐。

      然后您必须确保每个人都使用相同的版本(可能您只需将您的版本更新到可用的最新版本)。

      【讨论】:

        猜你喜欢
        • 2019-05-19
        • 1970-01-01
        • 2023-03-06
        • 2017-09-09
        • 1970-01-01
        • 2019-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多