【发布时间】:2014-09-07 11:15:23
【问题描述】:
当使用如下代码时:
scala> Future { null } onComplete { case Success(v) => v.toString }
Scala 抛出以下异常:
scala> java.lang.NullPointerException
at $line14.$read$$iw$$iw$$anonfun$2.apply(<console>:11)
at $line14.$read$$iw$$iw$$anonfun$2.apply(<console>:11)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
at scala.concurrent.impl.ExecutionContextImpl$$anon$3.exec(ExecutionContextImpl.scala:107)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
这没关系,因为我没有处理任何异常。问题是我的应用程序完全挂起。
我正在使用concurrent.ExecutionContext.Implicits.global,我认为onComplete 是在这个全局执行上下文中执行的。问题是执行上下文似乎停止接受任何工作并且应用程序只是挂起。
我是否必须明确使用try ... catch,以便在onComplete 发生意外情况时保护我的应用程序?
谢谢
【问题讨论】:
-
你能在未来的上下文中执行潜在的不安全操作吗?例如。
Future(null).map(_.toString).onComplete { ... }. -
导致空指针异常只是我发现在没有明确使用
throw的情况下导致异常的方式。我真的没有“潜在不安全”的操作,我在onComplete子句中的所有内容都是可能导致异常的代码..
标签: scala concurrency future