【问题标题】:Concurrent Read and Remove from List并发读取并从列表中删除
【发布时间】:2014-10-14 17:55:51
【问题描述】:
public static void main(String[] args) {    
    List<String> list = new ArrayList<String>(); 
    list.add("Value1"); 
    list.add("Value2"); 
    list.add("Value3"); 

    for(String val: list ) {  
        list.remove(0);     
        System.out.println(list); 
    } 
}

o\p: [值 2,值 3] 线程“主”java.util.ConcurrentModificationException 中的异常

这里我试图同时读取和删除第 0 个元素。 所以它应该给出一个异常。但是我的qn是为什么它在异常之后执行println语句。它发现异常的那一刻应该退出循环。

【问题讨论】:

  • 您有线程转储,它应该显示堆栈跟踪并为您提供引发异常的确切行号。通过 FOR 语句第二次尝试从列表中获取下一个值时,检查是否没有引发异常。 remove 操作对迭代器一无所知,但迭代器可以知道列表中的某些内容发生了变化。

标签: java


【解决方案1】:

你不应该在这里使用 for 循环。使用不会导致异常的迭代器:

ListIterator<String> iterator = list.listIterator();
while (iterator.hasNext()) {
    String string = iterator.next();
    iterator.remove();
}

【讨论】:

  • 是的,异常是好的。但是我的qn是为什么它在异常之后执行println语句。它发现异常的那一刻应该退出循环。
【解决方案2】:

你可以使用 get Iterator 和 iterator.remove()

How Iterator's remove method actually remove an object

【讨论】:

    【解决方案3】:

    因为您正在使用 for-each 循环,所以当您从数组列表中删除时,事情会向后移动,因此您会跳过一个因此。要解决此问题,请使用常规 for 循环;

    for(int i=0;i<list.size();i++){
      list.remove(i);
       i--;
       System.out.print(i);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多