线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:-1(排序条件)

时间:2014-07-10 10:03:50

标签: java eclipse sorting conditional-statements bounds

我希望有人评估此代码。它是Eclipse中的插入排序。每当我添加" ="时,java.lang.ArrayIndexOutOfBoundsException:-1就会出现此错误while循环中的符号k> = 0。如果我删除它,它将正常运行,但不会给我预期的输出按升序排序。

例如,如果我有值Initial [21,34,3,19,13],则输出将是 - > [21,3,13,19,34]。

逻辑上,将表达式while((temp< n.get(k))&&(k> = 0))正确地手动排列,但为什么它会让我遇到这种错误/异常超出范围?

    int j, k=0, temp, count = 0;
    List<Integer> n = set.getvalues();

    for(j = 1; j < n.size(); j++)
    {
        temp = n.get(j);
        k = j-1;

                while((temp < n.get(k)) && (k >= 0))
                {
                    n.set(k+1, n.get(k));
                    k = k-1;
                    count++;
                }

        n.set(k+1, temp);
        count++;
    }

2 个答案:

答案 0 :(得分:1)

在尝试致电k >= 0之前,您需要先检查n.get(k)。尝试获取具有负索引的元素没有意义,因此抛出ArrayIndexOutOFBoundsException

重新排序

while((temp < n.get(k)) && (k >= 0))

while((k >= 0) && (temp < n.get(k)))

对于logical and&&)操作,表达式从左到右进行评估,并在遇到false时立即停止评估。这也称为短路。

因此,如果k >= 0评估为false,则不会调用n.get(k),也不会抛出任何异常。

答案 1 :(得分:1)

按要求解释:

while((temp < n.get(k)) && (k >= 0))
{
    n.set(k+1, n.get(k));
    k = k-1;
    count++;
}

在(temp&lt; n.get(k))&amp;&amp;(k&gt; = 0))中的术语(k&gt; = 0)将在(temp&lt; n.get( k)),因为条件语句是从左到右解决的。因此它在已经使用k = -1访问后进行检查,这会抛出该异常,这就是为什么扭曲语句会修复它。