IndexOutOfBoundsException:我没有看到我的while循环

时间:2015-08-23 20:30:12

标签: java arraylist while-loop indexoutofboundsexception

我一直被困在IndexOutOfBoundsException上,我无法弄明白,我不明白为什么它指向我的while循环。有关该怎么办的任何建议?方法btw是一个循环调度模拟器,它似乎与我的一个测试文件完美配合而不是另一个。

public void roundRobin2(ArrayList<Jobs> c, int startSize)
{   
    //int n = 0;
    double counter = 0;
    double compTime = 0;
    while(!c.isEmpty())
    {
        int i = 0;
        System.out.println(c);
        for(i = 0; i < c.size(); i++)
        {
            if((c.get(i).jobTime) >= 2)
            {
                c.get(i).jobTime -= 2;
                counter += 2;

                if((c.get(i).jobTime) == 0)
                {
                    compTime += counter;
                }
            }
            else
            {
                (c.get(i).jobTime) -= 1;        
                counter += 1;

                if((c.get(i).jobTime) == 0)
                {
                    compTime += counter;
                }
            }
            //System.out.print("-" + c.get(i).jobName + "-" + counter);
            //n++;
            //if(n%10 == 0)
            //{
                //System.out.println("\n");
            //}
        }
        for(i = 0; i < c.size(); i++)
        {
            while(!c.isEmpty() && (c.get(i).jobTime) == 0)
            {
                c.remove(i);
            }       
        }
    }
    System.out.println("\n\nAverage completion times: "+ compTime + "/" + startSize +" = " + ((compTime)/startSize));
}

异常堆栈跟踪:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 7
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at cs431.edu.cpp.Main.roundRobin2(Main.java:143)

1 个答案:

答案 0 :(得分:1)

您正在删除正在迭代的集合中的项目,这非常糟糕,您永远不应该这样做。您可以使用具有For Each Control In Me.Controls If Control.GetType() Is GetType(TextBox) Then CType(Control, TextBox).Clear End If Next 方法的Iterator来执行此操作(但这很少有效),或者为您的集合制作临时副本。顺便说一句,循环法可以更容易实现。

此解决方案使用remove,因为头部的移除和末尾的插入都是LinkedList,这是高效且安全的。我还压缩了你的一些逻辑作为奖励:

O(1)