[jdom-interest] Bug in ListIterator.add() method
Christian Gruber
Christian.Gruber at biomax.com
Fri Apr 22 02:21:00 PDT 2005
Hello!
I think I have found two bugs in the ListIterator implementation of
Jdom 1.0. To be precise, it is the add() method implementation. I have
checked whether they are still there in the nightly build, and I still
found them there, too.
I have attached an example where I compare the behaviour of the Jdom
ListIterator implementation with the standard Java 1.4 ListIterator
implementation:
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
public class TestJdom {
public static void main(String[] args) {
try {
// Do something with java.util.ListIterator
List l = new LinkedList();
l.add("one");
l.add("two");
l.add("three");
ListIterator i;
for (i = l.listIterator(); i.hasNext();) {
String s = (String) i.next();
i.add(s + "_x");
i.add(s + "_y");
}
i.add("xxx");
System.out.println(l);
// Do the same with the Jdom ListIterator
Document d =
new Document().setRootElement(new Element("root"));
Element r = d.getRootElement();
r.addContent(new Element("element").setText("1"));
r.addContent(new Element("element").setText("2"));
r.addContent(new Element("element").setText("3"));
XMLOutputter o = new XMLOutputter();
for (i = r.getChildren("element").listIterator();
i.hasNext();) {
Element e = (Element) i.next();
i.add(new Element("element").setText(e.getText() +
"_x"));
//i.add(new Element("element").setText(e.getText() +
// "_y")); // bug1
}
//i.add(new Element("element").setText("xxx")); // bug2
o.output(d, System.out);
} catch (Exception e) {
e.printStackTrace();
}
}
}
When the comment is removed from the line marked with "bug1", after a
few seconds a java.lang.OutOfMemoryError is thrown.
When the comment is removed from the line marked with "bug2" instead,
the following exception is thrown:
java.lang.IndexOutOfBoundsException: Index: 7 Size: 6
at org.jdom.ContentList.add(ContentList.java:237)
at org.jdom.ContentList.add(ContentList.java:140)
at org.jdom.ContentList$FilterListIterator.add(ContentList.java:897)
at TestJdom.main(TestJdom.java:38)
I suppose that this is not the desired behaviour, since doing the same
thing with the ListIterator of java.util.LinkedList behaves as
expected.
As I suppose, Jdoms ListIterator.add() implementation has a problem
when it is called more than once and when it is called at the end of
the list.
Greetings,
Christian Gruber
More information about the jdom-interest
mailing list