Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用对象和重复列表时Java列表中的ConcurrentModificationException_Java_List_Function_Class_Arraylist - Fatal编程技术网

使用对象和重复列表时Java列表中的ConcurrentModificationException

使用对象和重复列表时Java列表中的ConcurrentModificationException,java,list,function,class,arraylist,Java,List,Function,Class,Arraylist,我正在使用Java来迭代列表,并根据某些条件对其进行更新。但是,由于它将提供ConcurrentModificationExceptionim,为此使用重复列表,但这仍然提供相同的异常 我有一个名为Storage的类,它表示一个虚拟存储,表示为一个文件夹(一个文件夹对应一个存储),该类包含一个属性fileList,表示它包含的文件列表(在文件夹内)。课程如下所示: public class Storage { // List of files in storage private

我正在使用Java来迭代列表,并根据某些条件对其进行更新。但是,由于它将提供
ConcurrentModificationException
im,为此使用重复列表,但这仍然提供相同的异常

我有一个名为
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;
    }
}

但这在我在
updateFileList()
函数中使用的
Enhanced For循环中提供了
ConcurrentModificationException
。在增强的for循环中,我通过删除不需要的文件来更新
this.getFilesList()
列表,并使用重复的列表
文件进行迭代。那么为什么我会得到
ConcurrentModificationException
异常??我做错了什么吗?

在遍历列表时,您正在从列表中删除元素

尝试从更改
getFilesList()
方法

public List<File> getFilesList() // Get list of files in storage
{
    return this.filesList;
}
public List getFilesList()//获取存储中的文件列表
{
返回此.filesList;
}

public List getFilesList()//获取存储中的文件列表
{
返回新的ArrayList(this.filesList);
}

在遍历列表时,您正在从列表中删除元素

尝试从更改
getFilesList()
方法

public List<File> getFilesList() // Get list of files in storage
{
    return this.filesList;
}
public List getFilesList()//获取存储中的文件列表
{
返回此.filesList;
}

public List getFilesList()//获取存储中的文件列表
{
返回新的ArrayList(this.filesList);
}

迭代时,不能使用
remove()
从列表中删除元素。但您可以通过使用迭代器来实现这一点:

    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;
            }
        }
    }
public void updateFileList(){
List files=this.getFilesList();
迭代器iter=files.Iterator();
while(iter.hasNext()){
文件f=iter.next();
如果(/*符合删除条件*/)
{
f、 删除();
iter.remove();
this.occupiedSize=this.occupiedSize-f.length()/1048576.0;
}
}
}

迭代时,不能使用
remove()
从列表中删除元素。但您可以通过使用迭代器来实现这一点:

    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;
            }
        }
    }
public void updateFileList(){
List files=this.getFilesList();
迭代器iter=files.Iterator();
while(iter.hasNext()){
文件f=iter.next();
如果(/*符合删除条件*/)
{
f、 删除();
iter.remove();
this.occupiedSize=this.occupiedSize-f.length()/1048576.0;
}
}
}

您也可以使用ListIterator,而不是使用for each。并使用方法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();

            }
        }
}
public void updateFileList()
{
列表文件=新的ArrayList();
files=this.getFilesList();
Iterator it=files.Iterator();
while(it.hasNext()){
如果(删除条件){
it.remove();
}
}
}

还可以阅读java中的fail-fast和fail-safe迭代器链接在这里

您也可以使用ListIterator,而不是使用for-each。并使用方法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();

            }
        }
}
public void updateFileList()
{
列表文件=新的ArrayList();
files=this.getFilesList();
Iterator it=files.Iterator();
while(it.hasNext()){
如果(删除条件){
it.remove();
}
}
}
这里还有关于java中fail fast和fail safe迭代器的阅读链接