我希望有人评估此代码。它是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++;
}
答案 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访问后进行检查,这会抛出该异常,这就是为什么扭曲语句会修复它。