zoukankan      html  css  js  c++  java
  • 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中。 

    跟我走啊~~
  • 相关阅读:
    laravel 多对多 belonsToMany
    C语言union关键字
    FW:程序在内存的划分(转)
    操作系统:进程/线程同步的方式和机制,进程间通信
    FW:考查嵌入式C开发人员的最好的16道题(转)
    操作系统死锁产生、条件、和解锁
    100层高楼摔2个鸡蛋的问题?
    【转】看完这个你的位运算学得就差不多了
    函数递归的几个例子
    如何查看服务器(linux系统)当前的负载信息(转)
  • 原文地址:https://www.cnblogs.com/wrh526/p/2660352.html
Copyright © 2011-2022 走看看