在列表中添加名称/值

时间:2014-01-30 04:13:07

标签: java error-handling

运行可执行文件时,我不断收到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));

提前感谢您的帮助!

编辑:

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 个答案:

答案 0 :(得分:1)

编辑现在您已发布堆栈跟踪,请在列表大小为{{1时尝试访问第二个元素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 - &gt; min_cost.get(k)

但是,由于您在min_cost.get(1)内创建了新的Lists,因此该值不存在。

因此,它会抛出for loop

答案 1 :(得分:0)

为什么要在循环中重新创建名称和min_cost对象?无论你添加到ArrayList中的是什么,都会在循环的每次迭代中消失。我猜你试图调用min_cost.get(k)时会发生异常。尝试将这些行放在for循环之上:

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