2014-01-30 3 views
1

Я продолжаю получать IndexOutOfBoundsException при запуске исполняемого файла. Первое имя и min_cost печатаются перед ошибкой. Я знаю, что он, вероятно, пытается получить доступ к индексу, к которому нельзя получить доступ. Я не могу понять, что не так.добавление имен/значений в список

for(int j = 0; j <= no_comps-1; j++){ 
       String line2 = in.nextLine(); 
       Scanner compline = new Scanner(line2); 
       int k = j-1; 

       String co_name = compline.next(); 
       int x = compline.nextInt(); 
       int y = compline.nextInt(); 
       int val = compute(tot_boxes,my_boxes,x,y); 

       List <String> names = new ArrayList <String>(500); 
       names.add(j,co_name); 

       List <Integer> min_cost = new ArrayList <Integer>(500); 
       min_cost.add(j,val); 

        while(j > 1){ 
        if(min_cost.get(j) > min_cost.get(k)){ 
         Collections.swap(names, j, k); 
         Collections.swap(min_cost, j, k); 
        } 
        else{ 

        } 

        } 
       System.out.println(names.get(j)+ " " +min_cost.get(j)); 

Заранее благодарим за любую помощь!

Edit:

DHL 46 
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 
at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:612) 
at java.util.ArrayList.add(ArrayList.java:426) 
+2

Пожалуйста, измените свой пост с [трассировки стека] (http://en.wikipedia.org/wiki/Stack_trace) – Christian

ответ

1

Edit: Теперь, когда вы разместили трассировки стека, пожалуйста, проверьте if (min_cost.size()==0), как вы пытаетесь получить доступ ко второму элементу 1, когда размер списка 0.

Я хотел бы предложить вам объявить Lists вне for loop:

List <String> names = new ArrayList <String>(500); 
List <Integer> min_cost = new ArrayList <Integer>(500); 

for (...) { 

// Your code 

} 

и использовать переменный список внутри доступ к значениям.

Что происходит сейчас, так это то, что вы создаете новый Lists каждый раз, когда цикл выполняется. Проблема начинается, когда значение j=2. Вы снова создаете новый Lists и присваиваете значения.

Но тогда для j=2 ваш if (j>1) становится истинным, и вы пытаетесь сравнить

if(min_cost.get(j) > min_cost.get(k)) 

Вы настроите k как:

int k = j-1; 

так для j=2:

k=1 

И min_cost.get(k) ->min_cost.get(1)

Но так как вы создали новый Lists внутри for loop, это значение не существует.

Следовательно, он выбрасывает IndexOutOfBoundsException.

+0

+1: И причина того, что первые 'name' и' min_cost' напечатаны, это для 'j == 0', все использования' k' не выполняются, потому что они лежат в цикле, начиная 'while (j> 1) {'. – Simon

+0

'while (j> 1)' должен защищать код от этой проблемы – JLewkovich

0

Почему вы воссоздаете имена и объекты min_cost внутри цикла? Все, что вы добавите в ArrayList, исчезнет с каждой итерацией цикла. Я предполагаю, что Исключение происходит, когда вы пытаетесь позвонить min_cost.get(k). Попробуйте поместить эти строки выше для цикла:

List <String> names = new ArrayList <String>(500); 
List <Integer> min_cost = new ArrayList <Integer>(500); 
Смежные вопросы