2012-01-27 3 views
-1

次のコードは、呼び出されるたびにConcurrentModificationExceptionをスローします。 2番目のコードは例外をスローしませんが、必要な正しいロジックではありません。オブジェクトがEditorFrameのインスタンスである場合、私はclose()メソッドであるカスタム廃棄戦略を呼び出す必要があります。しかし、基本的なフレームの場合はdispose()に電話してほしい。Java - ConcurrentModificationException

私はこのサイトを見回し、いくつかの指示に従ってきましたが、見つけたものはありませんでした。

例外をスローコード:

synchronized (frameList) { 
    for (Iterator<JFrame> it = frameList.iterator(); it.hasNext();) { 
     JFrame frame = it.next(); 
     if (frame instanceof EditorFrame) ((EditorFrame) frame).close(); 
     else frame.dispose(); 
     it.remove(); 
    } 
} 

このコードは動作しますが、それは私が欲しいものではありません:助けるため

synchronized (frameList) { 
    for (Iterator<JFrame> it = frameList.iterator(); it.hasNext();) { 
     JFrame frame = it.next(); 
     frame.dispose(); 
     it.remove(); 
    } 
} 

感謝を!

+5

'EditorFrame.close'メソッドは' frameList'を変更しますか? (現在のスレッドは 'frameList'のロックを保持します。ロックは再入可能です。スイングはイベントディスパッチスレッド(EDT)からのみ使用する必要があるため、ロックは必要ありません)。 –

+0

EditorFrameクラスを投稿できますか? –

+0

Tom Hawtinと同意する:このコードを1つのスレッド、つまりEDTでのみ実行する必要があるため、同期は必要ありません。どんな行が例外をスローしますか?また、すべてのif/elseブロックは、あいまいさを避けるために、コードブロックを中括弧で囲む必要があります。 –

答えて

6

ConcurrentModificationExceptionの原因となっているものを正確に取得することなく、まだすべてのオブジェクトを削除していますframeList

リストを反復処理した後で明示的にクリアしないのはなぜですか?

synchronized (frameList) { 
    for (JFrame frame : frameList) { 
     if (frame instanceof EditorFrame) ((EditorFrame) frame).close(); 
     else frame.dispose(); 
    } 
    frameList.clear(); 
} 
関連する問題