2013-05-11 16 views
6

次のコードを実行すると、例外が発生します。私は検索しましたが、解決策は見つかりませんでした。スレッド "main"の例外java.util.ConcurrentModificationException

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)のためで、それをループしながら、あなたはCollectionaddを呼び出すことはできません{

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); 

} 

} 

答えて

17

ライン

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

あなたはそれを反復している間linksListコレクションを変更します。次回のforループがmainにあるとき、Javaはコレクション上でnextを呼び出し、コレクションが変更されたことを確認して例外をスローします。

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

3

。ここで:

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

あなたはlinksListをループ内からmain方法からgrabLinksメソッドを呼び出します。

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

をあなたが別のCollectionにアイテムを追加する必要があり、その後、後にそれらをコピー。明らかそれはSetだ - 私はlinksListListだったと仮定していたとして例外がHashMapから来ていた理由を少しの間私は困惑していた何

でした。世界で最高の名前ではありません。

This should help

関連する問題