###前提・実現したいこと
こんばんは、毎度お世話になっております。
題名の通り、ConcurrentModificationException
の回避策について教えてほしいです。原因はわかっているのですが回避策がわかりません。
ボンバーマンを作っている中で上記のエラーに出会いました。
この質問に出てくるクラスは3つです。
MapObject
クラス(マップにプレーヤーや爆弾やアイテムといったオブジェクト全ての親クラス)MapField
クラス(地形情報を管理する。また、マップ上に存在するMapObject
をArrayList
で管理する)AutoHideMapObject
クラス(1 のクラスの拡張版。爆弾のように時間経過で勝手に消えてくれるMapObject
(NULLにはならずに上記のArrayList
から切り離され、画面外の位置に移動するだけ)。countTime()
メソッドを毎ループ実行することで実現)
###発生している問題
下記のコメント文の中でエラーがでています。原因はわかっておりa.countTime()
です。実は内部で、a
を先ほどのArrayList
から切り離せという命令をしています。つまり自分自身をArrayList
からremove(a)
とする実装になります。(a
つまり MapObject
が MapField
への参照を持っているので ArrayList
にアクセスできる)
###該当のソースコード
java
1class MapField{ 2 private int width; 3 private int height; 4 // 地形 5 private MapChip[][] field; 6 // マップ上のすべての MapObject が格納される 7 private ArrayList<MapObject> mapObject = new ArrayList<MapObject>(); 8 9 boolean removeMapObject(MapObject o){ 10 return mapObject.remove(o); 11 } 12 13 void countTime(){ 14 // このfor文でエラー 15 for(MapObject o : mapObject){ 16 if(o instanceof AutoHideMapObject){ 17 AutoHideMapObject a = (AutoHideMapObject)o; 18 a.countTime(); 19 } 20 } 21 } 22}
###考えた回避策
Iterator
のremove()
メソッド使う方法。countTime()
の引数にIterator
を与える(引数が増えるのでやりたくない)- 削除対象を保存してfor文を出た後に削除(
countTime
の内部でremove(自分自身)
が実行されるから無理)
きっと設計がダメだからこんなエラーと戦っているのでしょうが、どこの部分がダメなのかわからないので今回質問しました。ご教授よろしくお願いしますm(__)m
回答1件
あなたの回答
tips
プレビュー