2010-10-16 2 views
2

Кажется, я получаю исключение из-за пределов, но проблема в том, что это сообщение об ошибке, и мои инструменты отладки System.out и eclipse сообщают мне противоречивую информацию.Java 1.6 java.lang.IndexOutOfBoundsException Вопрос

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

Исключение в потоке "главный" java.lang.IndexOutOfBoundsException: Индекс: 9, Размер: 9
в java.util.ArrayList.RangeCheck (ArrayList.java : 547)
в 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
атрибуты = [3, 3, 3, 2, 3, 6, 3, 4, 4, 2]
атрибуты = 2

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

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

+0

Почему этот вопрос был поднят? – zengr

+1

Вы действительно хотите установить флажок напротив 'attributes.get (splitAtt)', а не просто 'splitAtt'? –

ответ

4

Внутри цикла, удалить элемент из списка:

attributes.remove(splitAtt); // Line 75 

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

+0

Вот оно. Ошибка не происходит в первый раз, когда она попадает на строку 61, а вторая. – ColinD

+0

Вы правы, спасибо, что поймали это. –

0

Не элемент первого массива начинается с 0?

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

Я был в стороне от java в течение некоторого времени, я мог ошибаться.

+0

Я смог ссылаться на attribute.get (9) на себя, то есть на System.out.println ("attributes =" + attributes.get (splitAtt)) ;, но он каким-то образом генерирует и исключает, если он находится в объявлении for , –

+0

Я изменил <= на <просто, чтобы убедиться, что он по-прежнему выбрасывает исключение. –

+0

Почему я получил -1 ??? – Christian

4

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

+0

Вы правы. Спасибо за ответ. –

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

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

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

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

Смежные вопросы