-1

ようこそ、Java アプレットで簡単な RPG ゲームをプログラミングしています。ますます複雑になり、多くのエラーが私の顔に投げ込まれます。今日、私は.remove();方法に問題があります。

Exception in thread "AWT-EventQueue-1" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.remove(Unknown Source)
    at rpg.main.paint(main.java:365)
    at rpg.main.update(main.java:331)
    at sun.awt.RepaintArea.updateComponent(Unknown Source)
    at sun.awt.RepaintArea.paint(Unknown Source)
    at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

エラーログはこんな感じ。プログラムのコード:

main.java

ご覧のとおり、プログラムの最後にペイント メソッドでエラーが表示されますが、プログラムの最初の間違った開始が原因である可能性がありますか?

public void initLocatables()
public void initLocatables2()

そして、それらが run メソッドの main while ループで呼び出されることを認めなければなりません。これらはエラーが発生する場所であり、以下のコメントには、エラーをスローした以前のメソッドも含まれています。remove();

for (Iterator i = locatablesArray.listIterator(); i.hasNext();) {
               Locatable l = (Locatable) i.next(); 
               l.draw(g);
               i.remove();
            }
/*while(itrLocatables.hasNext())
{
    Locatable l = itrLocatables.next();
    l.draw(g);
    l.remove();
}*/

返信ありがとうございます。

4

3 に答える 3

1

オブジェクトを反復している間は、リスト/マップからオブジェクトを削除することはできません。それが原因ですConcurrentModificationException

       i.remove();

すべての Locatable 要素を描画してからコレクションをクリアする場合は、その場で削除するのではなく、最初にすべてを描画してからコレクションをクリアする必要があります。

for (Iterator i = locatablesArray.listIterator(); i.hasNext();) {
               Locatable l = (Locatable) i.next(); 
               l.draw(g);
}

// Clear everything from the list
locatablesArray.clear();
于 2013-08-23T21:02:18.837 に答える
1

java.util.ConcurrentModificationException もう 1 つの方法は、locatablesArray の末尾と先頭で for ループを使用することです。そうすれば、削除された要素は、まだスキャンされていない配列の要素の位置を変更しません。

于 2013-08-23T21:06:33.757 に答える
1

を呼び出すrepaint()run()paint()は EDT のキューに入れられ、できるだけ早く呼び出されます。inlocatablesArrayへの呼び出しの繰り返しが別の時間に行われ、同じ時間に のコードが再初期化されると、エラーが発生します。 私のアドバイスは、特定の init セクションで init 操作を分離し、それを一度呼び出して、メイン ループを実行することです。initLocatables2()run()locatablesArraypaint()

もう 1 つ: なぜIterator(class field itrLocatables)を init するのinitLocatables2()ですか? 可能であれば、必要に応じて反復子を使用してください。

はっきりさせておきたいのですが、英語は私の母国語ではありません。

于 2013-08-23T21:29:54.363 に答える