• Java中的java.util.ConcurrentModificationException异常


    今日折腾半天这个错误:

    Exception in thread "main" java.util.ConcurrentModificationException
    	at java.util.SubList.checkForComodification(AbstractList.java:752)
    	at java.util.SubList.listIterator(AbstractList.java:682)
    	at java.util.AbstractList.listIterator(AbstractList.java:284)
    	at java.util.SubList.iterator(AbstractList.java:678)
    	at java.util.AbstractCollection.toString(AbstractCollection.java:414)
    	at java.lang.String.valueOf(String.java:2826)
    	at java.lang.StringBuilder.append(StringBuilder.java:115)
    	at java.util.AbstractMap.toString(AbstractMap.java:490)
    	at java.lang.String.valueOf(String.java:2826)
    	at java.io.PrintStream.println(PrintStream.java:771)
    	at com.wrh.java.study.sentenceSimilarity.SentenceSimilarity.expressCNKI(SentenceSimilarity.java:160)
    	at com.wrh.java.study.sentenceSimilarity.SentenceSimilarity.main(SentenceSimilarity.java:263)
    

    查阅文献后发现:

      错误是在对这个list迭代的时候另外一个线程增加或者删除了list中一个元素,那么迭代函数就会抛出这个异常,而改变其中某个元素的属性值之类的,对迭代过程不影响。 
      但是,我的List肯定不会有add,remove的, List subList = list.subList(limit,offset)。而这个subList我是不会去更新它。 
      但是问题还是出现了。 调试查看subList 发现这个家伙拥有的元素内容好像还是list的内容,只不过size是limit,这样的话也就是说 list.subList返回的一个封装的subList,实际的内容还是list的内容。 

    解决方法:

      修改list.subList, 使得返回复制拷贝后的list,先new ArrayList,然后把符合条件的从list里面一个个copy过去。 
          解决的方法当然就是在函数里把List深度拷贝到参数中,最容易理解的方式就是遍历一下整个list,逐个添加到参数ArrayList中,但这样代码比较笨拙。代码更简洁的方式是调用List的addAll方法,将整个list直接加到参数ArrayList中。 

    跟我走啊~~
  • 相关阅读:
    JPA的查询语言—使用构造器
    Servlet3.0使用注解定义Servlet
    jQuery操作<input type="radio">
    JPA的查询语言—使用原生SQL
    jQuery动态添加<input type="file">
    JPA的查询语言—JPQL的关联查询
    jQuery操作<select>
    Servlet3.0异步处理
    jQuery操作<input type="checkbox">
    mysql binlog二进制日志详解
  • 原文地址:https://www.cnblogs.com/wrh526/p/2660352.html
Copyright © 2020-2023  润新知