首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法初始化类$line10.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$

无法初始化类$line10.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$
EN

Stack Overflow用户
提问于 2017-08-23 20:20:24
回答 1查看 635关注 0票数 0

我用一个奇怪的问题开始了我的一天。我真的看不出我的代码有什么问题。取下面的几行

代码语言:javascript
复制
import scala.concurrent._
import scala.concurrent.duration._
import scala.util._
import scala.concurrent.ExecutionContext.Implicits.global

def f2 = Future.failed(new Exception("I do nothing"))
def f1 = Future { println("working"); Thread.sleep(5000); 1 }

val list = List(f2, f1)
val consolidated = Future.sequence(list)
consolidated.onComplete {
  case Success(_) => println("completed successfully")
  case Failure(e) => println(s"failed with ${e.getMessage}")
}
Await.result(consolidated, Duration.Inf)

然后在REPL中做一个:paste。我看到了一个奇怪的例外

代码语言:javascript
复制
~ > scala
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_121).
Type in expressions for evaluation. Or try :help.

scala> :paste
// Entering paste mode (ctrl-D to finish)

import scala.concurrent._
import scala.concurrent.duration._
import scala.util._
import scala.concurrent.ExecutionContext.Implicits.global

def f2 = Future.failed(new Exception("no work"))
def f1 = Future { println("working"); Thread.sleep(5000); 1 }

val list = List(f2, f1)
val consolidated = Future.sequence(list)
consolidated.onComplete {
  case Success(_) => println("completed successfully")
  case Failure(e) => println(s"failed with ${e.getMessage}")
}
Await.result(consolidated, Duration.Inf)


// Exiting paste mode, now interpreting.

java.lang.NoClassDefFoundError: Could not initialize class $line3.$read$$iw$$iw$
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)
    at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:140)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
java.lang.NoClassDefFoundError: Could not initialize class $line3.$read$$iw$$iw$
    at scala.runtime.java8.JFunction0$mcI$sp.apply(JFunction0$mcI$sp.java:12)
    at scala.concurrent.Future$.$anonfun$apply$1(Future.scala:653)
    at scala.util.Success.$anonfun$map$1(Try.scala:251)
    at scala.util.Success.map(Try.scala:209)
    at scala.concurrent.Future.$anonfun$map$1(Future.scala:287)
    at scala.concurrent.impl.Promise.liftedTree1$1(Promise.scala:29)
    at scala.concurrent.impl.Promise.$anonfun$transform$1(Promise.scala:29)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)
    at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:140)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
java.lang.Exception: I do nothing
  at .f2(<console>:16)
  ... 29 elided

scala>

我真的看不到Could not initialize class错误的原因。根据我的说法,代码应该只是打印"failed with no work“

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-23 21:29:13

问题是:

代码语言:javascript
复制
Await.result(consolidated, Duration.Inf)

当您对Future执行Await操作时,该操作将失败,它包含的异常将被抛出。由于REPL的工作方式,有一个未捕获的异常会导致它的一些机器崩溃。这看起来像是REPL中的一个bug,但似乎还没有被报道。

请注意,onComplete不会更改Future的结果。它只是在Future完成后安排要做的事情。具体地说,它不消耗Future。如果你打算转换Future,你可以这样做:

代码语言:javascript
复制
val transformed: Future[String] = consolidated.andThen {
  case Success(v) => "Completed successfully"
  case Failure(e) => s"Failed with ${e.getMessage}"
}

println(Await.result(transformed, Duration.Inf))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45839567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档