2016-06-18 6 views
-1

Ich habe eine Schleife, die durch einige Eigenschaften läuft, aber innerhalb dieser Schleife müssen einige Eigenschaften hinzufügen. Die erste Iteration des Programms kann laufen, aber aus der zweiten Iteration geschieht die folgende Ausnahme:Ausnahme in Java "java.util.ConcurrentModificationException", wie zu lösen?

Exception in thread "main" java.util.ConcurrentModificationException: Iterator: started at 5, now 113 
    at org.apache.jena.tdb.sys.DatasetControlMRSW.policyError(DatasetControlMRSW.java:157) 
    at org.apache.jena.tdb.sys.DatasetControlMRSW.access$000(DatasetControlMRSW.java:32) 
    at org.apache.jena.tdb.sys.DatasetControlMRSW$IteratorCheckNotConcurrent.checkCourrentModification(DatasetControlMRSW.java:110) 
    at org.apache.jena.tdb.sys.DatasetControlMRSW$IteratorCheckNotConcurrent.hasNext(DatasetControlMRSW.java:118) 
    at org.apache.jena.atlas.iterator.Iter$4.hasNext(Iter.java:303) 
    at org.apache.jena.atlas.iterator.Iter$4.hasNext(Iter.java:303) 
    at org.apache.jena.atlas.iterator.Iter$4.hasNext(Iter.java:303) 
    at org.apache.jena.atlas.iterator.Iter.hasNext(Iter.java:908) 
    at org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90) 
    at org.apache.jena.util.iterator.Map1Iterator.hasNext(Map1Iterator.java:49) 
    at org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90) 
    at br.com.edu.dataset.ConstrucaoDataSet.main(ConstrucaoDataSet.java:110) 
Java Result: 1 

Methode:

public ArrayList<Topic> annotate(String originalMarkup) throws Exception { 

    PreprocessedDocument doc = _preprocessor.preprocess(originalMarkup); 
    Collection<Topic> allTopics = _topicDetector.getTopics(doc, null); 

    ArrayList<Topic> bestTopics = _linkDetector.getBestTopics(allTopics, 0.5); 

    return bestTopics; 
} 

.... Haupt ...

Property body = model.getProperty("http://data.linkededucation.org/ns/linked-education.rdf#body"); 
StmtIterator iter = model.listStatements(null, body, (RDFNode) null); 

while (iter.hasNext()) { 
    Statement stmt = iter.nextStatement(); 
    String uri = stmt.getSubject().toString(); 
    String artigo = stmt.getObject().toString(); 
    ArrayList<Topic> bestTopics = annotator.annotate(artigo); 

    Resource lakPaper = model.createResource(uri); 
    for (Topic t : bestTopics) { 
     lakPaper.addProperty(DC.subject, model.createResource(keyValueProperty) 
       .addProperty(key, t.getTitle()) 
       .addProperty(value, _df.format(t.getWeight()))); 
     System.out.println(" - " + t.getTitle() + "[" + _df.format(t.getWeight()) + "]"); 
    } 
} 

Wie löst man dieses Problem?

+2

Indem Sie Ihre Liste nicht gleichzeitig ändern, während Sie darüber iterieren. Java kann das nicht tun. Verwenden Sie einen Iterator. –

Antwort

2

Wenn es nicht möglich ist, während der Iteration von der aktuellen Änderung in der Liste abzusehen, können Sie in diesem Fall CopyOnWriteArrayList anstelle von ArrayList aus dem java.util.concurrent Paket verwenden.

aus Java doc:

eine Thread-sichere Variante der Arraylist in dem alle Operationen mutative (hinzufügen, gesetzt, und so weiter), indem sie eine neue Kopie von dem zugrunde liegenden Array implementiert sind.

Daher wird Ihr Iterator nie ConcurrentModificationException werfen. mehr von hier lesen:

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

+0

Danke für die Antwort. Bin neu Nein java .. Ich frage mich, wie com CopyOnWriteArrayList.Podria Dieser Code mir wieder helfen würde? –

1

Concurrent Änderung tritt auf, wenn Sie versuchen, die „Struktur“ der Sammlung zu ändern, werden Sie Iterieren auf, das heißt, wenn Sie Elemente einfügen oder löschen, während auf der Liste iterieren.

Um dies zu vermeiden, verwenden Sie eine neue Sammlung und führen Sie das Einfügen und Löschen entsprechend durch.