私は現在、ソフトウェアエンジニアリングタイプのクラスのプロジェクトに取り組んでおり、奇妙なエラーとして表示されています。私がJavaのConcurrentModificationExceptionを行った研究/デバッグによると、next()メソッドが呼び出されるまでにHashMapが変更されたときに、通常がスローされます。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()(ハッシュマップが変更された方法)
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をスローするメソッドです。修正方法ではまだ反復があることはわかりません。 –