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中。
跟我走啊~~