Re: Yet another ConcurrentModificationException question
Heiner K?cker wrote:
Andy Chambers schrieb
Apologies for asking about this FAQ. I have looked up the relevant
java tutorial but I just want to check my understanding with the
following example.
Iterator oIterator = m_oCollection.iterator();
while( oIterator.hasNext()) {
Element oElement = (Element)oIterator.next();
String sOIDValue =
oElement.getAttribute(oElement.getOIDKey());
if( sOIDValue != null && sOIDValue.equals(sElementOID) ) {
// We have a match
return oElement;
}
}
If I know that neither getAttribute() or getOIDKey() can alter the
"structure" of m_oCollection, is it true to say that a
ConcurrentModificationException thrown from within the body of the
while loop above, *must* have been caused by another thread altering
the structure of m_oCollection?
So to prevent this from happening, I can make m_oCollection a
synchronized Vector (currently it is just a normal vector), and put
this while loop inside a synchronized block.
Use a for loop , no iterator.
If you mean
for (Object obj : m_oCollection) {
Element oElement = (Element)obj;
...
}
.... there *is* an Iterator, hidden by the syntax but present anyhow.
It's a bit like
System.out.println("Hello, " + System.getProperty("user.name"));
.... where a StringBuilder is used even though you don't see it
mentioned in the source code.
--
Eric.Sosman@sun.com