“线程中的异常”;“主要”;java.util.ConcurrentModificationException
当我运行下面的代码时,我得到一个异常。我搜索了一下,但找不到任何解决办法“线程中的异常”;“主要”;java.util.ConcurrentModificationException,java,arrays,iterator,hashset,Java,Arrays,Iterator,Hashset,当我运行下面的代码时,我得到一个异常。我搜索了一下,但找不到任何解决办法 Exception in thread "main" java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(Unknown Source) at java.util.HashMap$KeyIterator.next(Unknown Source) at com.aybits.s
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
at java.util.HashMap$KeyIterator.next(Unknown Source)
at com.aybits.software.linkgrabber.Grabber.main(Grabber.java:45)
行号45用于(字符串linkFromCollection:linksList){
公共类抓取器{
静态字符串url;
文件文件;
static Set linksList=new HashSet();
字符串匹配String=“java2s.com/Code”;
静态布尔值isCrawling=true;
静态int STOP_WATCH=0;
公共抓取器(字符串url){
Grabber.url=url;
}
公共void抓取链接(字符串urlToCrawl)引发IOException{
doc=Jsoup.connect(urlToCrawl).timeout(20*1000.get();
Elements links=doc.select(“a[href]”);
用于(元素链接:链接){
//打印(“*a:(%s)”,link.attr(“abs:href”),修剪(link.text(),35));
if(link.attr(“abs:href”).toString()包含(matchingString)){
如果(!linksList.contains(link.attr(“abs:href”).toString()){
System.out.println(“添加-”+link.attr(“abs:href”);
linksList.add(link.attr(“abs:href”).toString());
}
}
}
}
公共静态void main(字符串[]args)引发IOException{
抓取器应用=新抓取器(“http://java2s.com");
应用程序链接(url);
while(正在绘制){
用于(字符串linkFromCollection:linksList){
app.grabLinks(linkFromCollection);
if(linksList.contains(linkFromCollection)){
秒表+=5;
System.out.println(“秒表是”+秒表);
}否则{
秒表-=1;
System.out.println(“秒表是”+秒表);
}
如果(停止观察>=100){
isCrawling=假;
System.out.println(“秒表是”+秒表);
}
}
}
ICVSWrite writer=新的ICVSWrite();
String[]strArray=(String[])linksList.toArray();
作家,作家(strArray);
}
}
在集合
上循环时,不能调用添加
。此处:
for (Element link : links) {
if(...){
if(...){
...
linksList.add(link.attr("abs:href").toString());
^^^ <- here
}
}
}
您必须将您的项目添加到另一个集合中
,然后将它们复制过来
让我困惑了一段时间的是,为什么异常来自于HashMap
,因为我假设linksList
是一个列表
——显然它是一个集合
。不是世界上最好的名字
.线路
linksList.add(link.attr("abs:href").toString());
在迭代时修改linksList
集合。下次通过main
中的for
循环,Java调用集合上的next
,查看集合已被修改,并抛出异常
执行增强的for
循环时,不能向集合中添加或从集合中删除
for(String linkFromCollection : linksList) {
app.grabLinks(linkFromCollection);
linksList.add(link.attr("abs:href").toString());