9

以下のコードを実行すると、例外が発生します。検索しましたが、解決策が見つかりませんでした。

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 はfor(String linkFromCollection : linksList){

public class Grabber {

static String url;
Document doc;
static Set<String> linksList = new HashSet<String>();
String matchingString ="java2s.com/Code";
static boolean isCrawling = true;
static int STOP_WATCH = 0;

public Grabber(String url){
    Grabber.url = url;
}

public void grabLinks(String urlToCrawl) throws IOException{
    doc = Jsoup.connect(urlToCrawl).timeout(20 * 1000).get();
    Elements links = doc.select("a[href]");

    for (Element link : links) {
        //print(" * a: <%s>  (%s)", link.attr("abs:href"), trim(link.text(), 35));
        if(link.attr("abs:href").toString().contains(matchingString)){
            if(!linksList.contains(link.attr("abs:href").toString())){
                System.out.println("Added - " + link.attr("abs:href"));
                linksList.add(link.attr("abs:href").toString());
            }
        }
    }
}

public static void main(String[] args) throws IOException {
    Grabber app = new Grabber("http://java2s.com");
    app.grabLinks(url);

    while(isCrawling){
        for(String linkFromCollection : linksList){
            app.grabLinks(linkFromCollection);

            if(linksList.contains(linkFromCollection)){
                STOP_WATCH += 5;
                System.out.println("STOP_WATCH IS " + STOP_WATCH);
            }else{
                STOP_WATCH -= 1;
                System.out.println("STOP_WATCH IS " + STOP_WATCH);
            }

            if(STOP_WATCH >= 100){
                isCrawling = false;
                System.out.println("STOP_WATCH IS " + STOP_WATCH);
            }
        }


    }
    ICVSWrite writer = new ICVSWrite();

    String[] strArray = (String[]) linksList.toArray();
    writer.write(strArray);

}

}
4

2 に答える 2

19

この線

linksList.add(link.attr("abs:href").toString());

linksListコレクションを繰り返し処理している間にコレクションを変更します。次回の のforループでmain、Java はnextコレクションを呼び出し、コレクションが変更されたことを確認し、例外をスローします。

拡張forループを実行しているときは、コレクションに追加したりコレクションから削除したりすることはできません。

于 2013-05-11T18:12:51.963 に答える
5

ループしてaddいる間は呼び出すことができません。Collectionここ:

for (Element link : links) {        
    if(...){
        if(...){
            ...
            linksList.add(link.attr("abs:href").toString());
                      ^^^ <- here
        }
    }
}

ループオーバー内からメソッドgrabLinksからメソッドを呼び出します:mainlinksList

for(String linkFromCollection : linksList) {
   app.grabLinks(linkFromCollection);       

アイテムを別のアイテムに追加してから、Collectionそれらをコピーする必要があります。

少しの間私が困惑していたのは、それが a であるHashMapと想定していたのに、なぜ a から例外が発生したのかということlinksListでしたList-明らかにそれはSetです。世界で最高の名前ではありません。

これは役立つはずです。

于 2013-05-11T18:12:33.013 に答える