Java 编辑XML时并发修改错误

Java 编辑XML时并发修改错误,java,concurrentmodification,Java,Concurrentmodification,在JSP文件中使用Java编辑XML文件时,我遇到了一个并发修改错误。这是如何造成的,我如何解决 ElementFilter f = new ElementFilter("rurl-link"); Iterator subchilditr = childNode.getDescendants(f); while (subchilditr.hasNext()) { // Exception is thrown here. Element subchild = (Element) subc

在JSP文件中使用Java编辑XML文件时,我遇到了一个并发修改错误。这是如何造成的,我如何解决

ElementFilter f = new ElementFilter("rurl-link");
Iterator subchilditr = childNode.getDescendants(f);

while (subchilditr.hasNext()) { // Exception is thrown here.
    Element subchild = (Element) subchilditr.next();

    if (subchild.getText().equalsIgnoreCase(prevtext)) {
        subchild.setText(link);
        out.println("Updated");
    }
}
这是stacktrace:

java.util.ConcurrentModificationException
    java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
    java.util.AbstractList$Itr.next(AbstractList.java:343)
    org.jdom.DescendantIterator.next(DescendantIterator.java:134)
    org.jdom.FilterIterator.hasNext(FilterIterator.java:91)
    org.apache.jsp.rurl_005fchangelink_005fxml_jsp._jspService(rurl_005fchangelink_005fxml_jsp.java:101)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

我相信你正在使用JDOM库?您需要在迭代器循环之外修改
subchild

ElementFilter f = new ElementFilter("rurl-link");
Iterator subchilditr = childNode.getDescendants(f);
List<Element> subchildList = new ArrayList<Element>();

while (subchilditr.hasNext()) {
    Element subchild = (Element) subchilditr.next();

    if (subchild.getText().equalsIgnoreCase(prevtext)) {
        subchildList.add(subchild);
    }
}

for (Element subchild : subchildList) {
    subchild.setText(link);         
}
ElementFilter f=新的ElementFilter(“rurl链接”);
迭代器subchilditr=childNode.getsubstands(f);
List subchildList=new ArrayList();
while(subchilditr.hasNext()){
Element subchild=(Element)subchilditr.next();
if(subchild.getText().equalsIgnoreCase(prevtext)){
子儿童列表。添加(子儿童);
}
}
for(元素子子类:子类列表){
子项setText(链接);
}

这还不够信息,我也添加了堆栈跟踪。虽然没有足够的信息可以肯定,但并发修改异常意味着您在迭代该childNode对象时更改了其子代的计数。不建议在迭代这样的序列时修改序列。在JSP文件中而不是在Java类中错误地编写Java代码不会使其成为JSP问题。在普通Java类中执行此操作时,您会遇到完全相同的问题。我删除了JSP标记,因为它与特定问题的原因无关。