Java 1.6 java.lang.IndexOutOfBoundsException Вопрос - PullRequest
2 голосов
/ 16 октября 2010

Кажется, я получаю исключение массива за пределами границ, но проблема в сообщении об ошибке, и мои средства отладки System.out и eclipse сообщают мне противоречивую информацию.

Это мое исключение:

Исключение в теме "главная" java.lang.IndexOutOfBoundsException: Индекс: 9, размер: 9
at java.util.ArrayList.RangeCheck (ArrayList.java:547)
at java.util.ArrayList.get (ArrayList.java:322)
на InduceC45.C45 (InduceC45.java:61)
в InduceC45.main (InduceC45.java:15)

Строка 61 в InduceC45:

for(int attLoop = 1; attLoop <= attributes.get(splitAtt); attLoop++){

Это говорит о том, что splitAtt выходит за границы атрибутов ArrayList, достаточно просто.

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

System.out.
System.out.println("splitAtt="+splitAtt);
System.out.println("attributes="+attributes);
System.out.println("attributes="+attributes.get(splitAtt));

Результатом распечатки стало:

splitAtt = 9
attribute = [3, 3, 3, 2, 3, 6, 3, 4, 4, 2]
атрибуты = 2

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

На случай, если кто-то захочет получить полный источник ... http://github.com/Ryuho/CSC466/blob/master/lab3/src/InduceC45.java Строка 61

Ответы [ 4 ]

4 голосов
/ 16 октября 2010

Внутри цикла вы удаляете элемент из списка:

attributes.remove(splitAtt); // Line 75

На втором круге вызов attributes.get(splitAtt) будет ссылаться на индекс, которого больше нет в списке.Поскольку вы не удалили этот последний элемент до входа в цикл, ваши операторы печати успешно выполняются.

4 голосов
/ 16 октября 2010

Я видел весь код. Вы удаляете элементы из атрибутов, используя attributes.remove(splitAtt), когда вы продолжаете в том же духе, условие for вызывает исключение, когда размер списка меньше.

2 голосов
/ 17 октября 2010
  1. Ваши распечатки работают, потому что они находятся перед циклом, и исключение происходит не на первой итерации цикла, а на следующих.

  2. Вы изменяете «атрибуты» внутри цикла, удаляя из него элементы. На следующей итерации, когда он хочет проверить условие цикла, он терпит неудачу.

Возможно, вам нужно сохранить attributes.get(splitAtt) в переменной перед циклом, чтобы вы могли избежать доступа к attributes в условии цикла.

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

0 голосов
/ 16 октября 2010

Разве первый элемент массива не начинается с 0?

for(int attLoop = 0; attLoop < attributes.get(splitAtt); attLoop++){

Я был далеко от Java, возможно, я ошибаюсь.

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