Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.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.util.ConcurrentModificationException_Java_Android_Arraylist - Fatal编程技术网

数组列表中的java.util.ConcurrentModificationException

数组列表中的java.util.ConcurrentModificationException,java,android,arraylist,Java,Android,Arraylist,我是android新手,在使用ArrayList时遇到了困难。我在代码中使用了ArrayList。在某些情况下,我会更新arraylist值。但当我试图从该数组列表中检索数据时,我得到了java.util.Concurrent modification异常。我尽力解决这个问题。但我真的解决不了。这就是我在这里问的原因。请帮帮我 声明: HashMap<String,List<Player>> subPlayerAndCountForBackArrow = new Hash

我是android新手,在使用ArrayList时遇到了困难。我在代码中使用了ArrayList。在某些情况下,我会更新arraylist值。但当我试图从该数组列表中检索数据时,我得到了java.util.Concurrent modification异常。我尽力解决这个问题。但我真的解决不了。这就是我在这里问的原因。请帮帮我

声明:

HashMap<String,List<Player>> subPlayerAndCountForBackArrow = new HashMap<String, List<Player>>();

在遍历列表时,不能从列表中删除项目

我见过的最好的解决方案是创建第二个列表,将要删除的项目添加到第二个列表中。然后迭代第二个列表,并从第一个列表中删除每个项目。完成后,清除第二个列表。此时,应该没有对要删除的项的引用

下面是一些代码,第一个循环检查是否应该删除该项,并将其添加到删除列表中。下一个循环将完全删除它们

    for (int i = 0; i < myList.size(); ++i) {
        Item item = myList.get(i);
        if (item.isValid()) {
            item.doStuff();
        } else {
            nulledItems.add(item);
        }
    }

    if (!nulledItems.isEmpty()) {
        for (Item item : nulledItems) {
            if (myList.contains(item)) {
                myList.remove(item);
            }
        }
        nulledItems.clear();
    }
for(int i=0;i
在第一段代码中,您已经迭代了
子层和countforbackarrow
并修改了它(通过调用
iter.remove


你不能那样做。不能对同时修改的列表进行迭代。这就是异常告诉您的。

当您尝试同时迭代和修改集合时,会发生此异常。 因此,我建议采用另一个列表,其中包含要删除的项目。
然后再次迭代以仅删除。

请发布logcat并告诉我异常发生在哪一行。我已经对logcat在上述问题中指出的错误行进行了注释。好的,但很难看到@donfuxx,我很抱歉。这是log cat错误:03-15 03:44:40.409:E/AndroidRuntime(2720):由:java.util.ConcurrentModificationException 03-15 03:44:40.409:E/AndroidRuntime(2720):在java.util.AbstractList$SubAbstractList.size(AbstractList.java:360)03-15 03:44:40.409:E/AndroidRuntime(2720):在com.example.barnyar.MainActivity.updateSubPlayer(MaunActudia. java:1627)03-1503:44:40.409:E/ANDROIDRunTime:(2720):…14,这与问题无关,但是你应该考虑1。缩进代码,2。在那个<代码>上提取< < /Code >语句。它们看起来很相似(创建一个方法)。我应该如何修正它更新数组列表和检索数据??(我的第一个选择是尽量避免使用与输入(迭代和读取)和输出(从中删除元素)相同的列表)。稍作休息,从实际代码中退一步,并尝试重新思考使用该修改循环实际想要实现的目标。当然有更好的方法来实现这一目标。遗憾的是,很难用该代码实现您想要实现的目标(至少对我而言),所以我不能直接告诉你一个更好的方法,因为我不太明白你想做什么。是吗?我真的很抱歉。会有一个更好的方法,就像你说的。我会重新考虑的。
if(v.getId()==R.id.imgRightArrow){
if(subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).size()>0){  //this is the error line 
Log.i("UpArrowUpArrowUpArrow", "UpArrow");
if(imanopage <= subPlayerAndCountForBackArrow.size()){
        subPlayer1.removeAllViews();
subPlayer2.removeAllViews();
subPlayer3.removeAllViews();
subPlayer4.removeAllViews();
for(int j = 0;j<subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).size();j++){

if(j == 0){
subPlayer1.addView(subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j));
RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParamssubPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j).getLayoutParams();
     lp.addRule(RelativeLayout.CENTER_IN_PARENT);
     lp.width = 50;
     lp.height = 45;
if(j == 1){
subPlayer2.addView(subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j));
      RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParams)subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j).getLayoutParams();
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
lp.width = 50;
lp.height = 45;
}

if(j == 2){
subPlayer3.addView(subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j));
RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParams)subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j).getLayoutParams();
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
lp.width = 50;
lp.height = 45;
}

if(j == 3){
subPlayer4.addView(subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j));
RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParams)subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).get(j).getLayoutParams();
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
lp.width = 50;
lp.height = 45;
}
}
if(imanopage == subPlayerAndCountForBackArrow.size()){
}
      else{
imanopage ++;
}
}
}
}
    for (int i = 0; i < myList.size(); ++i) {
        Item item = myList.get(i);
        if (item.isValid()) {
            item.doStuff();
        } else {
            nulledItems.add(item);
        }
    }

    if (!nulledItems.isEmpty()) {
        for (Item item : nulledItems) {
            if (myList.contains(item)) {
                myList.remove(item);
            }
        }
        nulledItems.clear();
    }
Iterator<Player> iter = subPlayerAndCountForBackArrow.get(String.valueOf(imanopage)).iterator();
[...]
iter.remove();
[...]
if(subPlayerAndCountForBackArrow.get(String.valueOf(imanopage+1)).size()>0){  //this is the error line 
[...]