Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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
ListIterator抛出“;“线程中的异常”;“主要”;java.util.ConcurrentModificationException“;JAVA_Java_Exception_Arraylist_Do While - Fatal编程技术网

ListIterator抛出“;“线程中的异常”;“主要”;java.util.ConcurrentModificationException“;JAVA

ListIterator抛出“;“线程中的异常”;“主要”;java.util.ConcurrentModificationException“;JAVA,java,exception,arraylist,do-while,Java,Exception,Arraylist,Do While,我在网上搜索了一下,但要么解释得太离谱,要么人们建议使用ArrayList来避免出现异常。。所以我现在有点无助。这是我的代码: import java.util.ArrayList; import java.util.ListIterator; import java.util.Scanner; public class ArrayIterator { static Scanner scan = new Scanner(System.in); static ArrayList

我在网上搜索了一下,但要么解释得太离谱,要么人们建议使用ArrayList来避免出现异常。。所以我现在有点无助。这是我的代码:

import java.util.ArrayList;
import java.util.ListIterator;
import java.util.Scanner;

public class ArrayIterator {

    static Scanner scan = new Scanner(System.in);
    static ArrayList<String> simpleList = new ArrayList<>();
    static ListIterator<String> simpleIterator = simpleList.listIterator(0);
    static int b = 5;

    public static void main(String[] args) {

        getInput();
        spellOutput();

    }
    private static void getInput(){
        System.out.println("What do you want to add to your list? You can name five items");
        for (int i = 0; i < b; i++) {
            String m = scan.nextLine();
            simpleList.add(m);
        }
    }
    private static void spellOutput(){
        System.out.println("Here are the items from your list: ");
        do{
            System.out.println(simpleIterator.next());
        }while(simpleIterator.hasNext());
    }
}
任何帮助都将不胜感激:)

  • 您创建了迭代器
  • 您修改了列表
  • 您使用了迭代器
  • 这就是引发并发异常的原因。为了避免引发异常,您应该仅使用迭代器将项添加到列表中,如下所示:

    simpleIterator.add(m)
    

    问题是迭代器是在调用getInput()之前创建的

    这里迭代器是从一个空列表创建的。禁止在迭代(搜索失败快速迭代器)时从结构上修改(添加或删除元素)集合


    解决方案-将迭代器创建移动到spellOutput()。

    当在同一集合/列表/映射上执行另一个操作时,修改集合/列表/映射时,会发生并发修改

    比如说

     List<String> list = Arrays.asList("yes", "no", "maybe");
     for(String string : list) { //operation 1 - list iteration
         list.add("definitely not"); //operation 2 - add to list -- will throw concurrent modification exception because operation 1 is still pending.
     }
    
    List List=Arrays.asList(“是”、“否”、“可能”);
    for(String:list){//操作1-列表迭代
    list.add(“绝对不是”);//操作2-添加到列表-将引发并发修改异常,因为操作1仍处于挂起状态。
    }
    
    对于您的场景,要修复此问题,请删除

    ListIterator<String> simpleIterator
    
    ListIterator simpleIterator
    
    作为全局变量,并在从扫描仪将元素添加到列表后对其进行初始化

    private static void spellOutput() {
        ListIterator<String> simpleIterator = simpleList.listIterator(0);
        System.out.println("Here are the items from your list: ");
        do {
            System.out.println(simpleIterator.next());
        } while(simpleIterator.hasNext());
    }
    
    private静态输出(){
    ListIterator simpleIterator=simpleList.ListIterator(0);
    System.out.println(“以下是列表中的项目:”);
    做{
    System.out.println(simpleIterator.next());
    }while(simpleIterator.hasNext());
    }
    

    这样,就不会再有并发修改异常了

    您说得对,先生。那很容易!谢谢你的回答:)
    private static void spellOutput() {
        ListIterator<String> simpleIterator = simpleList.listIterator(0);
        System.out.println("Here are the items from your list: ");
        do {
            System.out.println(simpleIterator.next());
        } while(simpleIterator.hasNext());
    }