2016-10-01 9 views
0

Javaを使用してリストを反復し、特定の基準に基づいてリストを更新しています。しかし、ConcurrentModificationExceptionを複製リストを使って提供するので、これでも同じ例外があります。オブジェクトと重複リストを使用する場合のJavaリストのConcurrentModificationException

フォルダ(1つのストレージ用に1つのフォルダ)として表される仮想記憶域を表すクラスStorageがあります。このクラスには、そのフォルダ内にあるファイルの一覧を示す属性fileListが含まれています。クラスは次の通りです

public class Storage 
{ 
    // List of files in storage 
    private List<File> fileList = new ArrayList<File>(); 

    // Occupied size in MB 
    private double occupiedStorage; 

    // Location of storage folder 
    private String location; 

    public Storage(String loca) // Create a storage 
    { 
     this.location = loca; 
     this.occupiedSize = 0; 
    } 

    public addFile(File f) // Add file to storage 
    { 
     // Copy the file to folder in location 'this.location' 
     this.fileList.add(f); 
     this.occupiedSize = this.occupiedSize + f.length()/1048576.0; 
    } 

    public List<File> getFilesList() // Get list of files in storage 
    { 
     return this.filesList; 
    } 

    public double getOccupiedSize() // Get the occupied size of storage 
    { 
     return this.occupiedSize; 
    } 
} 

私は10個のオブジェクトを使用して合計10個のストレージを作成しましたが、それぞれに別々のフォルダがあります。私はforループとthis.addFile(f)関数の呼び出しを使用して、多くの異なるファイルをすべてのフォルダに追加しました。

は、その後、私は一定の基準を満たす特定のストレージから特定のファイルだけを削除したいと私はStorageクラスに次の削除機能を追加し、

public void updateFileList() 
{ 
    List<File> files = new ArrayList<File>(); 
    files = this.getFilesList(); 
    for (File f : files) 
    { 
     if (/*Deletion criteria satisfied*/) 
     { 
      f.delete(); 
      this.getFilesList().remove(f); 
      this.occupiedSize = this.occupiedSize - f.length()/1048576.0; 
     } 
    } 
} 

しかし、これは私がEnhanced For LoopConcurrentModificationExceptionを提供しますupdateFileList()機能で使用します。拡張されたforループの中で、私は不要なファイルを削除してthis.getFilesList()リストを更新しています。繰り返しはfilesという重複リストを使って行います。では、どうして私はConcurrentModificationException例外を受け取りますか?何か間違っているのですか?

答えて

1

public List<File> getFilesList() // Get list of files in storage 
{ 
    return this.filesList; 
} 

からgetFilesList()方法を変更してみてください。しかし、イテレータを使用してこれを行うことができます。

public void updateFileList() { 
     List<File> files = this.getFilesList(); 
     Iterator<File> iter = files.iterator(); 
     while (iter.hasNext()) { 
      File f = iter.next(); 
      if (/*Deletion criteria satisfied*/) 
      { 
       f.delete(); 
       iter.remove(); 
       this.occupiedSize = this.occupiedSize - f.length()/1048576.0; 
      } 
     } 
    } 
0

リストから反復しながらリストから要素を削除しています。

は、反復しながら、あなたがremove()で、リストから要素を削除することはできません

public List<File> getFilesList() // Get list of files in storage 
{ 
    return new ArrayList<File>(this.filesList); 
} 
1

ListIteratorを使用する代わりに、ListIteratorを使用することもできます。リストからファイルを削除するには、iterator.removeメソッドを使用します。

public void updateFileList() 
{ 
    List<File> files = new ArrayList<File>(); 
    files = this.getFilesList(); 
    Iterator<File> it = files.iterator(); 
     while (it.hasNext()) { 

      if (deletion condition) { 

       it.remove(); 

      } 
     } 
} 

また、Javaのリンク内のイテレータはここfail-fast and fail-safe iterator in java

約ファスト失敗し、フェイルセーフ読みます
関連する問題