【发布时间】:2009-12-22 17:40:23
【问题描述】:
我为棋盘游戏九人莫里斯写了一个蒙特卡洛播放器。一切基本上都是不可变的。该程序涉及大量期货(数百个)和大量修改不可变地图。有时我会遇到以下异常:
java.lang.NullPointerException
at scala.collection.mutable.HashTable$class.elemHashCode(HashTable.scala:154)
at scala.collection.immutable.HashMap.elemHashCode(HashMap.scala:41)
at scala.collection.mutable.HashTable$class.findEntry(HashTable.scala:66)
at scala.collection.immutable.HashMap.findEntry(HashMap.scala:41)
at scala.collection.immutable.HashMap.undo$1(HashMap.scala:132)
at scala.collection.immutable.HashMap.undo$1(HashMap.scala:130)
at scala.collection.immutable.HashMap.makeCopy(HashMap.scala:154)
at scala.collection.immutable.HashMap.makeCopyIfUpdated(HashMap.scala:161)
at scala.collection.immutable.HashMap.update(HashMap.scala:66)
at scala.collection.immutable.Map$class.$plus(Map.scala:66)
at scala.collection.immutable.HashMap.$plus(HashMap.scala:41)
at morris.players.MapBasedMorrisBoard.applyMove(MapBasedMorrisBoard.scala:30)
at morris.players.MonteCarloPlayer$$anonfun$main$1$$anonfun$apply$1.apply(MonteCarloPlayer.scala:77)
at morris.players.MonteCarloPlayer$$anonfun$main$1$$anonfun$apply$1.apply(MonteCarloPlayer.scala:77)
at scala.actors.Futures$$anonfun$2$$anonfun$apply$1.apply(Future.scala:45)
at scala.actors.Futures$$anonfun$2$$anonfun$apply$1.apply(Future.scala:44)
at scala.actors.Reaction.run(Reaction.scala:78)
at scala.actors.FJTask$Wrap.run(Unknown Source)
at scala.actors.FJTaskRunner.scanWhileIdling(Unknown Source)
at scala.actors.FJTaskRunner.run(Unknown Source)
我只使用不可变地图,所以我想知道这是由我自己的代码中的错误还是 scala 库中的错误引起的。查看跟踪时,您可以看到,在堆栈的下方有对可变 HashTable 的调用。也许这会导致并发问题?
我的程序中发生异常的代码只是将另一个集合添加到不可变 Map 中:
myMap ++ (someInteger -> aValue)
编辑: 没有并发的相同程序可以完美运行。
【问题讨论】:
-
实际上,我非常希望这是 Scala 中的一个错误,我已经要求 SO 只是为了得到一些整合,以便将报告发布到 Scala 错误跟踪器。
-
我在实现对“libscala”的 STM 支持时遇到了同样的问题。该错误出现在 scala 2.8 和 2.7.7 中。
标签: exception scala concurrency immutability