2016-06-18 13 views
-1

いくつかのプロパティを実行するループがありますが、そのループ内でいくつかのプロパティを追加する必要があります。プログラムの最初の反復が実行されますが、2回目の反復から次の例外が起こることができます。javaの例外 "java.util.ConcurrentModificationException"解決する方法?

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 

方法:...

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

....メインを

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()) + "]"); 
    } 
} 

その問題を解決する方法は?

+2

並べ替え中にリストを同時に変更しないでください。 Javaはそれを行うことはできません。イテレータを使用します。 –

答えて

2

反復中に並行修正を控えることができない場合は、java.util.concurrentパッケージのArrayListの代わりにCopyOnWriteArrayListを使用することができます。 Javaのドキュメントから

すべての変更操作が (ように設定され、追加、および) 基になる配列の新しいコピーを作成することにより実装されるのArrayListのスレッドセーフな変数。

したがって、イテレータは決してConcurrentModificationExceptionをスローしません。 読むより、ここから:リストで反復しながら、あなたが要素を挿入または削除した場合

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

+0

答えをありがとう。新しいですいいえjava ..私は思うだろうどのようにcom CopyOnWriteArrayList.Podriaこのコードはもう一度私を助ける? –

1

同時変更はつまり、あなたがコレクションの「構造」を変更しようとすると、あなたが反復されて起こります。

これを避けるには、新しいコレクションを使用し、それに応じて挿入と削除を実行します。

関連する問題