Pratik
Pratik

Reputation: 367

JAVA java.util.ConcurrentModificationException:null Exception

I am working on my code and getting "java.util.ConcurrentModificationException". I googled it and also know that such error comes only when you try to modify on-going iterative variable, which I don't feel in my case. Below is my code.

// This line is having an error
for(Statement s: _mConsumableStatements)
    {
        System.out.println("s:"+s);

        Boolean isConflict=false;
        Resource uri=s.getSubject();

        System.out.println("uri:"+uri);
        System.out.println("1");

        if(RepStatementsAsHash.containsKey(uri))
        {
            System.out.println("2");

            if(RepStatementsAsHash.get(uri).containsKey(RDFS.LABEL))
                RepStatementsAsHash.get(uri).remove(RDFS.LABEL);
            else if(RepStatementsAsHash.get(uri).containsKey(RDFS.SUBCLASSOF))
                RepStatementsAsHash.get(uri).remove(RDFS.SUBCLASSOF);
            else if(RepStatementsAsHash.get(uri).containsKey(RDFS.RANGE))
                RepStatementsAsHash.get(uri).remove(RDFS.RANGE);
            else if(RepStatementsAsHash.get(uri).containsKey(RDF.TYPE))
            {
                System.out.println("2.1");

                Value RepTypeObject=RepStatementsAsHash.get(uri).get(RDF.TYPE);
                Value ConsumableTypeObject=CStatements.get(uri).get(RDF.TYPE);

                if (RepTypeObject.stringValue().equals(OWL.CLASS) || RepTypeObject.stringValue().equals(RDFS.CLASS))
                {
                    if(ConsumableTypeObject.stringValue().equals(OWL.DATATYPEPROPERTY) || ConsumableTypeObject.stringValue().equals(OWL.OBJECTPROPERTY) || ConsumableTypeObject.stringValue().equals(RDF.PROPERTY))
                    {
                        isConflict=true;
                        //_mConflictingStatements.add(s);
                    }
                    else
                    {
                        RepStatementsAsHash.get(uri).remove(RepTypeObject);
                    }
                }
                else if(RepTypeObject.stringValue().equals(OWL.DATATYPEPROPERTY) || ConsumableTypeObject.stringValue().equals(OWL.OBJECTPROPERTY) || RepTypeObject.stringValue().equals(RDF.PROPERTY))
                {
                    if (ConsumableTypeObject.stringValue().equals(OWL.CLASS) || ConsumableTypeObject.stringValue().equals(RDFS.CLASS))
                    {
                        isConflict=true;
                        //_mConflictingStatements.add(s);
                    }
                    else
                    {

                    }
                }
                else
                {
                    if( !(RepTypeObject.stringValue().equals(OWL.DATATYPEPROPERTY) || ConsumableTypeObject.stringValue().equals(OWL.OBJECTPROPERTY) || RepTypeObject.stringValue().equals(RDF.PROPERTY) || ConsumableTypeObject.stringValue().equals(OWL.CLASS) || ConsumableTypeObject.stringValue().equals(RDFS.CLASS))  )
                    {
                        if(RepTypeObject.stringValue()!=ConsumableTypeObject.stringValue())
                        {
                            isConflict=true;
                        }

                    }
                }
                System.out.println("2.2");
                if(!isConflict)
                    {
                        addStatementsInRepository(uri.stringValue(),c_import);
                    }
            } // LABEL-TYPE 
        }
        else // No  URI Conflict
            addStatementsInRepository(uri.stringValue(),c_import);

        System.out.println("3");
    }

It is showing error something like :

11:13:24.405 ERROR - error while importing Sesame data:
java.util.ConcurrentModificationException: null
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) ~[na:1.7.0_71]
    at java.util.ArrayList$Itr.next(ArrayList.java:831) ~[na:1.7.0_71]
    at org.apache.marmotta.platform.core.services.importer.rdf.RDFImporterImpl.importData2(RDFImporterImpl.java:433) [ulysses-core-1.0-alpha-2.jar:1.0-alpha-2]

How to resolve it?

Upvotes: 2

Views: 23882

Answers (1)

loafy
loafy

Reputation: 105

On this line, like many others in your code: RepStatementsAsHash.get(uri).remove(RepTypeObject);, you are iterating through the loop, and removing it whilst iterating. You can use an Iterator to iterate through a list or map, and then remove elements using iterator.remove().

Example

Upvotes: 1

Related Questions