-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();
}
}
感謝を!
'EditorFrame.close'メソッドは' frameList'を変更しますか? (現在のスレッドは 'frameList'のロックを保持します。ロックは再入可能です。スイングはイベントディスパッチスレッド(EDT)からのみ使用する必要があるため、ロックは必要ありません)。 –
EditorFrameクラスを投稿できますか? –
Tom Hawtinと同意する:このコードを1つのスレッド、つまりEDTでのみ実行する必要があるため、同期は必要ありません。どんな行が例外をスローしますか?また、すべてのif/elseブロックは、あいまいさを避けるために、コードブロックを中括弧で囲む必要があります。 –