1

(イテレータを使用して)反復しようとしているオブジェクトのLinkedListがあります。衝突があるかどうかを確認し、衝突している場合は、リストから削除します。ただし、同時変更の例外が発生します。私はそれを同期ブロックに入れ、try catchブロックでエラーをキャッチしようとしましたが、どちらもまったく役に立たないようです。コードは次のとおりです。

private void updateTP() {
    synchronized (toiletpaper) {
        Iterator<ToiletPaper> iter = toiletpaper.iterator();
        while (iter.hasNext()) {
            ToiletPaper tp = iter.next();
            tp.update(1000, 700);
            if (toilet.overlaps(tp)) {
                System.out.println("tp splash!");
                toiletpaper.remove(tp);
                menu.removeLife();
            }
        }
    }
}

問題についての考えはありがたいです、私はこことグーグルを調べました、そしてそれらのすべては例外を捕まえるかそれを同期させると言いました、どちらもうまくいかないようです...助けてください。

4

3 に答える 3

4

例外を回避するには、iter.remove()代わりにを使用してください。これにより、リストから個別に検索して削除する現在の呼び出しではなく、イテレータインスタンスを介して要素が削除されます。つまり、同時変更です。

于 2012-12-04T02:52:20.497 に答える
2

を使用してコレクションを直接変更しているため、例外がスローされますtoiletpaper.remove(tp);iter.remove()コレクションを反復処理しながら、コレクションを変更するためにを使用する必要があります。

于 2012-12-04T02:52:33.007 に答える
2

あなたがそうするとき、toiletpaper.remove(tp)あなたはあなたのリンクリストを修正します(あなたはそれを再リンクします)、そしてそれ故にあなたはそのエラーを受け取ります。イテレータは無効になりました。

于 2012-12-04T02:52:44.560 に答える