-2

このメソッドが例外をスローする理由がわかりません:

public void add(Object obj){
    gameObjects.add(obj); //here the exception happens
}

...これはそうではありませんが:

public void add(Object obj){
    gameObjects.add(obj); // no exception actually happens here 
    gameObjects.remove(obj);
}

実行時の例外であることを考えると、なぜこれが起こるのでしょうか?

例外:

Exception in thread "Thread-0" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)
    at threads.Main.tick(Main.java:181)
    at threads.Main.run(Main.java:104)

このメソッドは、オブジェクト内の tick メソッドに対して呼び出されます。

gameObjectsnull ではありません:

List<Object> gameObjects = new ArrayList<Object>(128);
4

4 に答える 4

0

ドキュメントによると

この例外は、そのような変更が許可されていない場合に、オブジェクトの同時変更を検出したメソッドによってスローされる場合があります。

たとえば、あるスレッドが Collection を変更しているときに、別のスレッドが Collection を反復処理することは一般的に許可されていません。一般に、反復の結果は、これらの状況では未定義です。一部の Iterator 実装 (JRE によって提供されるすべての汎用コレクション実装の実装を含む) は、この動作が検出された場合に、この例外をスローすることを選択する場合があります。これを行う反復子は、将来の不確定な時点で恣意的で非決定論的な動作を危険にさらすのではなく、迅速かつ明確に失敗するため、フェイルファスト反復子として知られています。

于 2013-07-01T18:05:56.953 に答える
0

objectトラバース中に同じものを変更することはできません。

JavaDocと言う

このクラスの iterator および listIterator メソッドによって返される反復子は、フェイルファストです。反復子の作成後に、反復子自体の remove メソッドまたは add メソッド以外の方法でリストが構造的に変更された場合、反復子は ConcurrentModificationException をスローします。

詳細については、これらのリンクに従ってください。彼らはあなたが学ぶのを助けるかもしれません.

同時変更例外 http://docs.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html

于 2013-07-01T18:08:43.610 に答える