我目前正在开发一个软件工程类型类的项目,并运行我认为是一个奇怪的错误。根据我已经完成Java的研究/调试ConcurrentModificationException通常在HashMap被修改时调用next()方法时被抛出。尽管HashMap被还原为原始状态,但并发修改异常?
为了给你一个问题域的想法,这是一个国际象棋游戏,我决定将死。
- 获取的HashMap(板)
- 的所有键(坐标键:键)目前如下我的代码的结构 ...
- 移动件被发现在船上
- 检查国王是受到攻击
- 移动式靠背
- 环
尽管HashMap处于与迭代开始时相同的状态 - 大小和精确值,但这部分代码在循环时会生成ConcurrentModificationException。
任何想法可能会导致这种情况?
循环:
for(ValidatorCoordinate key: keys){
if(board.findPiece(key).getPieceType() != XiangqiPieceType.GENERAL
&& moveValid(key, spaceBetween, color)
&& tryBlock(key, spaceBetween, dst, color)){
return true;
}
}
tryBlock()(方法其中HashMap中被修改)
private boolean tryBlock(ValidatorCoordinate source,
ValidatorCoordinate destination,
ValidatorCoordinate underAttack, XiangqiColor c){
board.movePiece(source, destination, c);
boolean blocked = !underAttack(underAttack, c);
board.movePiece(destination, source, c);
return blocked;
}
的movePiece()方法绝对HashMap中(在这一点上彻底的测试)内移动件
任何帮助将不胜感激。
谢谢!
编辑:为了澄清,这个一般的方法一直工作,直到我将运动抽象为另一种方法(tryBlock)。此前tryBlock的内容位于循环内部,并且不会引发异常。这也是为什么我关心这一点,至于我应该抛出这个例外。
任何修改都被'HashMap'拒绝,即使它最终回到原始状态。 (出于很好的理由;即使地图内容相同,哈希桶的内部安排也可能不同。) –
只是为了澄清,是否有任何理由说明为什么直到循环才会抛出此异常呢?这种修改在技术上是允许的,但循环抱怨。 此外,这种相同的方法以前工作,但片的移动并没有抽象成另一种方法在那一点。这个错误只出现在重构中。 谢谢! – bwbonanno
'Iterator'方法通常是抛出ConcurrentModificationException的方法。修改方法不知道还有一个迭代仍在继续。 –