Vector ArrayIndexOutOfBounds

时间:2010-04-13 14:26:01

标签: java

我有一个带有以下代码的ArrayIndexOutofBounds异常。 在 Node nodeJ = vect.get(j)

的行处抛出异常

但它对我没有意义,因为j肯定小于i而 Node nodeI = vect.get(i) 不会抛出任何异常。

感谢任何帮助。

public static Vector join(Vector vect) throws ItemNotFoundException {

    Vector<Node> remain = vect;
    for (int i = 1; i < vect.size(); i++) {
        Node nodeI = vect.get(i);
        for (int j = 0; j < i; j++) {//traverse the nodes before nodeI
            Node nodeJ = vect.get(j);

            if (nodeI.getChild1().getSeq().equals(nodeJ.getSeq())) {
                nodeI.removeChild(nodeJ);
                nodeI.setChild(nodeJ);
                remain.remove(j);
            }
            if (nodeI.getChild2().getSeq().equals(nodeJ.getSeq())) {
                nodeI.removeChild(nodeJ);
                nodeI.setChild(nodeJ);
                remain.remove(j);
            }
        }
    }
    return remain;
}

Vector<Node> remain = vect; for (int i = 1; i < vect.size(); i++) { Node nodeI = vect.get(i); for (int j = 0; j < i; j++) {//traverse the nodes before nodeI Node nodeJ = vect.get(j); if (nodeI.getChild1().getSeq().equals(nodeJ.getSeq())) { nodeI.removeChild(nodeJ); nodeI.setChild(nodeJ); remain.remove(j); } if (nodeI.getChild2().getSeq().equals(nodeJ.getSeq())) { nodeI.removeChild(nodeJ); nodeI.setChild(nodeJ); remain.remove(j); } } } return remain; }

6 个答案:

答案 0 :(得分:6)

您正在通过别名引用remain从正在迭代的同一向量中删除元素。如果你想使用副本,你应该有

Vector<Node> remain = new Vector<Node>(vect);

答案 1 :(得分:4)

如果在内部循环中从向量中删除了多个i - j节点,会发生什么?您最终会得到j > vect.size()

可能最好将第二个for循环中的条件更改为j < i && j < vect.size(),但是我认为算法存在一些缺陷,它涉及对一个集合进行双重迭代以在迭代时从中删除元素

答案 2 :(得分:1)

当您在迭代它时,您正在从vect删除内容。你确定那是你想做的吗?

请记住这一行:

Vector<Node> remain = vect;

创建vect的副本。从remain删除某些内容,它也将从vect中删除,因为这两个名称指的是同一个实际对象。

答案 3 :(得分:1)

你应该使用Iterator。查看文档http://java.sun.com/docs/books/tutorial/collections/interfaces/collection.html

您可以阅读:

  

请注意,Iterator.remove是在迭代期间修改集合的唯一安全方法;如果在迭代进行过程中以任何其他方式修改基础集合,则行为未指定。

答案 4 :(得分:0)

您正在从矢量中删除项目。

使用一些日志记录在内循环的每次迭代中输出向量的内容,你会看到发生了什么。

答案 5 :(得分:0)

从向量中移除项目(您执行此操作)时,向量的长度会发生变化。问题是删除后的代码删除了很多节点,现在使用的索引不再有效。