• 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中。 

    跟我走啊~~
  • 相关阅读:
    Bash 命令的解析
    vscode ctrl+P 打开文件后固定文件
    Linux 使用 tree 命令生成文件目录结构
    分享一款“暗黑系列”Idea主题插件Material Theme【改】
    linux上搭建svn服务器并设置自启动
    springBoot项目里获取resource目录下的文件(可用于各种linux服务器部署)【我】
    linux下svn与apache整合搭建
    liunx设置utf-8
    Fiddler抓包,并修改请求数据
    解决vue+el使用this.$confirm,不能阻断代码往下执行
  • 原文地址:https://www.cnblogs.com/wrh526/p/2660352.html
Copyright © 2020-2023  润新知