1

以下のスニペットを使用して、アドホック列を除外する必要があるというひねりを加えて、スプレッドシートを処理しようとしています。私はそれを行う大まかな方法​​を知っています。例外をArrayListに入れて、それぞれのリストを処理し、現在の行の列をインクリメントするのは厄介ですが、それを実行するだけです。

しかし、私はタイトルのエラーを受け取っています。これは決して起こらないと信じています。私はArrayListをループして比較しているだけで、何も変更していません。エラーはどこにありますか?例外リストを処理するためのより良い方法はありますか?

ArrayList noProcess = new ArrayList();
Iterator itr00 = noProcess.iterator();
Iterator itr01 = noProcess.iterator();
noProcess.add(new Integer("5"));
noProcess.add(new Integer("18"));
....
 boolean include=true;
  for(int i=0;i<archive.length;i++){
    for (int j = 0; j < archive[i].length; j++) {
      while (itr00.hasNext()) {
        if (j == ( (Integer) itr00.next()).intValue())
          include = false;
      }
      if (include) {...
4

4 に答える 4

4

Iterableイテレータを作成した後(イテレータを介して以外)の内容を変更することはできません。変更しないと、イテレータを移動するとすぐにConcurrentModificationExceptionが発生します。イテレータを作成してから実行しnoProcess.add(new Integer("5"));、後で続行します。イテレータ。

また、2つのイテレータを作成します-それも行うべきではありません-それはクレイジーです。

于 2011-07-22T13:49:49.207 に答える
1

JavaDocから、

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

たとえば 、別のスレッドがコレクションを反復処理しているときに、あるスレッドがコレクションを変更することは一般的に許可されていません。

于 2011-07-22T13:51:41.257 に答える
1

Javaドキュメントから:

このクラスのイテレータメソッドとlistIteratorメソッドによって返されるイテレータはフェイルファストです。イテレータの作成後にリストが構造的に変更された場合、イテレータ自体のremoveまたはaddメソッド以外の方法で、イテレータはConcurrentModificationExceptionをスローします。したがって、同時変更に直面した場合、イテレータは、将来の不確定な時点で任意の非決定論的な動作のリスクを冒すのではなく、迅速かつクリーンに失敗します。

イテレータのaddメソッドを使用して、要素をリストに追加します

于 2011-07-22T13:57:33.983 に答える
0

イテレータを取得した後にリストにレコードを追加し、それを修正します。それで動作するはずです。

于 2011-07-22T13:52:24.483 に答える