Vector ArrayIndexOutOfBounds - PullRequest
       24

Vector ArrayIndexOutOfBounds

1 голос
/ 13 апреля 2010

У меня исключение ArrayIndexOutofBounds со следующим кодом. Исключение выдается в строке, где Node nodeJ = vect.get(j)

но для меня это не имеет смысла, поскольку j определенно меньше, чем i, и Node nodeI = vect.get(i) не выдает никаких исключений.

любая помощь приветствуется.

public static Vector join(Vector vect) throws ItemNotFoundException {</p> <pre><code> 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 ]

6 голосов
/ 13 апреля 2010

Вы удаляете элементы из того же вектора, по которому итерируете, с помощью псевдонима remain. Если вы хотите использовать копию вместо этого, вы должны иметь

Vector<Node> remain = new Vector<Node>(vect);
4 голосов
/ 13 апреля 2010

Что произойдет, если во внутреннем цикле вы удалите более i - j узлов из вектора? Вы получите j > vect.size().

Вероятно, лучше всего изменить условие во втором цикле for на j < i && j < vect.size(), однако я думаю, что в алгоритме есть одна ошибка, заключающаяся в двойной итерации по коллекции, чтобы удалить из нее элементы, пока вы итерируете ее. 1006 *

1 голос
/ 13 апреля 2010

Вы должны использовать Iterator. Смотрите документацию http://java.sun.com/docs/books/tutorial/collections/interfaces/collection.html

Вы можете прочитать:

Обратите внимание, что Iterator.remove - единственный безопасный способ изменить коллекцию во время итерации; поведение не определено, если базовая коллекция изменена любым другим способом во время выполнения итерации.

1 голос
/ 13 апреля 2010

Вы удаляете вещи из vect, пока вы итерируете по нему.Вы уверены, что это то, что вы хотите сделать?

Помните, что эта строка:

Vector<Node> remain = vect;

делает не создание копии vect.Удалите что-нибудь из remain, и оно будет удалено из vect, потому что два имени относятся к одному и тому же реальному объекту.

0 голосов
/ 13 апреля 2010

Когда вы удаляете элемент из вектора (что вы делаете), длина вектора меняется. Проблема в том, что в коде после удаления было удалено так много узлов, что теперь он использует индексы, которые больше не действительны.

0 голосов
/ 13 апреля 2010

Вы удаляете элементы из своего вектора.

Используйте некоторую регистрацию для вывода содержимого вектора на каждой итерации внутреннего цикла, и вы увидите, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...