在while循环中改变条件的顺序会使程序崩溃

时间:2013-11-29 07:33:36

标签: java loops for-loop while-loop object-oriented-analysis

更改while循环中的条件顺序会导致程序崩溃。如果我这样写:while(a[in-1]>=temp && in>0),该程序将不起作用。为什么?错误是:ArrayIndexOutOfBoundsException:-1。以下代码有效,直到我进行上述更改。

 public class ISort {
public int[] sort(int[] a){
    int n=a.length;
    for(int out=1;out<n;out++){
        int temp=a[out];
        int in=out;
        while(in>0 && a[in-1]>=temp ){
           a[in]=a[in-1];
           in--;
        }
        a[in]=temp;
    }
    return a;
}
public static void main(String[] args){
    int[] a={3,2,1,6,3,8,8,10,9};
    ISort s=new ISort();
    int[] res=s.sort(a);
    for(int i=0;i<res.length;i++ ){
        System.out.print(" "+res[i]+" ");
    }
}
}

4 个答案:

答案 0 :(得分:5)

由于Short-circuit evaluation

如果你写while(in>0 && a[in-1]>=temp),那么如果in <= 0,则不评估第二部分。

为什么?

因为 false&amp;&amp;任何总是 false ,因此如果第一面已被评估为 false ,则检查另一方是多余的。

我认为您在更改订单时AarrayIndexOutOfBoundsException因为in<= 0并且您仍尝试在否定索引中访问a。这就是为什么当你想通过一些对象访问一个方法并且你不确定该对象是否为 null 时,你有时会这样做:

if(myVar != null && myVar.myMethod())

答案 1 :(得分:1)

因为如果in变为0,那么in - 1将为-1,而且数组的索引无效。

while(in>0 && a[in-1]>=temp)有效,因为

in > 0评估为false时,由于 短路 a[in - 1] >=temp而未评估

while(a[in-1]>=temp && in>0)没有,因为

将评估第一个a[in - 1],当in到达0时,in - 1将为-1,这将导致异常-1不是数组的有效索引,而是抛出ArrayIndexOutOfBoundsException

答案 2 :(得分:0)

条件不起作用的原因是while(a[in-1]>=temp && i>0)数组在in=0得到负指数。

答案 3 :(得分:0)

考虑in = 0的情况。将评估的第一件事是a[in - 1] = a[-1] = IndexOutOfBounds。通过首先检查in的值,如果in不大于0,则中止检查数组索引。