使用对象和重复列表时Java列表中的ConcurrentModificationException
我正在使用Java来迭代列表,并根据某些条件对其进行更新。但是,由于它将提供使用对象和重复列表时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
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迭代器的阅读链接