0

このコードでjava.util.ConcurrentModificationExceptionが発生しましたが、その理由を理解できないか、修正できないようです。

BOにはこれがあります(特権はBO内の配列リストです)

public void setPrivilegename(String privilegename) {
    this.privileges.add(privilegename); 
}

List<PrivilegeObjectBO> arraylist = new ArrayList<PrivilegeObjectBO>();if (rs != null)              {
    while (rs.next()) {        
        for (BO bo : arraylist) {
            if (bo.getRolepkey()==rs.getInt("ROLE_PKEY")) {                         
                bo.setPrivilegename(rs.getString("SP.NAME"));

            }else{
                BO newobj = new BO();
                newobj.setRolepriviledgepkey(rs.getInt("PRIVILEGE_PKEY"));
                newobj.setProticolpkey(protocol);                
                newobj.setPrivilegename(rs.getString("SP.NAME"));
                newobj.setRolepkey(rs.getInt("SRP.ROLE_PKEY"));
                arraylist.add(newobj);
            }
        }
    }
}
4

5 に答える 5

3

ArrayListjavadocによる

The iterators returned by this class's iterator and listIterator methods are fail-fast: if the list is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException.

for (BO bo : arraylist)

Above for-each loop gets Iterator for the list and

  arraylist.add(newobj);

You are trying to modify the list without using iterators own methods, which results in ConcurrentModificationException

Here is SO discussion on possible solutions.

于 2013-02-06T16:38:16.127 に答える
1

ArrayListforeachと同時に反復して要素を追加することはできません。

次のようにイテレータを使用します。

Iterator<PrivilegeObjectBO> iterator = arraylist.iterator();
while (iterator.hasNext()) {
  ...
}
于 2013-02-06T16:38:11.493 に答える
1

Javaでは、コレクションを反復処理しているときにコレクションを変更すると、常にConcurrentModificationExceptionが発生します。

考えられる解決策:追加または削除されたアイテムに一時的なコレクションを使用し、反復が完了した後にそれらのアイテムを追加または削除します。

于 2013-02-06T16:40:14.393 に答える
0

Collections.synchronizedList(List<?>)多分あなたは静的な方法を見ることができます。指定されたListオブジェクトから安全なスレッドを返すList必要があり、例外は発生しなくなります。それ以外の場合は、メソッド宣言

にキーワードを追加することにより、(該当する場合)同期されたリストにアクセスするメソッドを設定しようとすることができます。synchronized

于 2013-02-06T16:44:10.227 に答える
0

他の人はすでにそれを繰り返すことは許可されていないことaddを指摘しています。ArrayList

しかし、とにかく問題を解決するには、リスト内の何かが重複を避けるために行に一致するかどうかをループがチェックしているように見えるため、リスト全体を反復処理してから試行する必要があるようです。addこの場合、リストが最後まで重複しているかどうわからないため、リストを繰り返し処理しながらリストに追加する必要はありません。

したがって、繰り返して、一致するものが見つかるかどうかを確認してください。

List<PrivilegeObjectBO> arraylist = new ArrayList<PrivilegeObjectBO>();
if (rs != null) {
    while (rs.next()) {

        boolean found = false;
        for (BO bo : arraylist) {
             if (bo.getRolepkey() == rs.getInt("ROLE_PKEY")) {      
                 bo.setPrivilegename(rs.getString("SP.NAME"));
                 found = true;
             }
        }

        if (!found) {
            BO newobj = new BO();
            newobj.setRolepriviledgepkey(rs.getInt("PRIVILEGE_PKEY"));
            newobj.setProticolpkey(protocol);                
            newobj.setPrivilegename(rs.getString("SP.NAME"));
            newobj.setRolepkey(rs.getInt("SRP.ROLE_PKEY"));
            arraylist.add(newobj);
        }
    }
}

あなたが本当にリストにすでにBO一致していないすべての新しいものを追加したいのでなければ...BO

于 2013-02-06T16:57:59.717 に答える