2017-01-06 13 views
-2

データベースから選択する一連のフィールドを表すリストがあります。私はそれをselect文の文字列を作るために使うクラスに渡しています。ビルド時に、リスト#isEmptyをチェックするたびにConcurrentModificationExceptionが発生します。私はそれをImmutableListに変更しました。この問題はもう解決されません。コレクションが変更された場所のトラッキング(ConcurrentModificationException)

しかし、これは私に混乱している...私は、同時にそれを修正した場所ではUnsupportedOperationExceptionを得ないでしょうか?例外をスロー

ライン:

if (list.isEmpty() || ... null checks) { ... } 

が例外:

at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1231) 
at java.util.ArrayList$SubList.size(ArrayList.java:1040) 
at java.util.AbstractCollection.isEmpty(AbstractCollection.java:86) 

SOLUTION:

私は#isEmptyのためにチェックしていたリストがサブリストでした。メインリストは、サブリストが作成された後に編集されました(いくつかの必須フィールドを追加するため)。 #isEmptyをチェックすると、ConcurrentModificationExceptionが発生しました。おかげさまで

答えて

1

isEmpty()ConcurrentModificationExceptionを投げてはいけません。これは、イテレータが変更されている間にのみ(一部のコレクションのみ)

カスタムリストの実装がこの例外をスローした場合、期待される動作ではないため、ラップすると期待しますもはやこれをやめないようにする。

私はImmutableListに変更しましたが、この問題は発生しません。

この例外は、この例外が表示されない別の理由であるリストをラップするのではなく、コピーしている可能性が最も高いです。 (あなたがコピーしたオリジナルを使用しているので)

私はおそらく私が持っているスタックトレースを得ることができます。

私はバグ、または少なくとも悪いデザインすることを呼び出します。それは文書化されておらず、また理由もないようです。

は、代わりにsubList()を取るのあなたは、私はあなたがやっている疑いが何であるのsubList()のコピーを取ることができます。

+1

だから... ...私はどのように私はおそらく – user2303325

+0

はサブリスト撮影...私はスタックトレースを取得することができ...私の質問があると仮定しますか()?これは、自分自身の実装ではなく、これを投げているjava.util.ArrayListです。 – user2303325

+0

だから多分これは関連しているかもしれません。私が最初に使用するフィールドを取ったとき、それは大きな配列のようです。だから、リスト#パーティションを使って、その配列を小さなリストに分割します。そして、それらのリストを繰り返して、文の文字列を作成します。そして、私がパーティションのフィールドリストが空であるかどうかをチェックすると、例外が発生します。 – user2303325

関連する問題