【问题标题】:changing the order of condition in while loop crashes the program在while循环中更改条件顺序会使程序崩溃
【发布时间】:2013-11-29 07:33:36
【问题描述】:

更改 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]+" ");
    }
}
}

【问题讨论】:

  • 请附上您收到的错误信息。
  • 编程的第一条规则:阅读错误信息。

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


【解决方案1】:

因为Short-circuit evaluation

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

为什么?

因为false && anything的结果总是false,所以如果第一边已经被评估为false,检查另一边是多余的em>。

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

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

【讨论】:

    【解决方案2】:

    因为如果in 变成0 那么in - 1 将是-1 并且这是无效的数组索引。

    while(in&gt;0 &amp;&amp; a[in-1]&gt;=temp) 之所以有效是因为

    in &gt; 0 被评估为false 时,由于短路 a[in - 1] &gt;=temp 未被评估

    while(a[in-1]&gt;=temp &amp;&amp; in&gt;0) 不是因为

    首先将评估a[in - 1],当in 到达0in - 1 将是-1,这将引发异常,因为-1 不是数组的有效索引并会抛出@ 987654336@.

    【讨论】:

      【解决方案3】:

      条件不起作用的原因是while(a[in-1]&gt;=temp &amp;&amp; i&gt;0) 数组在in=0 处获得了负索引。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2010-11-09
          • 1970-01-01
          • 1970-01-01
          • 2015-11-29
          • 1970-01-01
          • 2013-07-25
          • 1970-01-01
          • 1970-01-01
          • 2012-06-19
          相关资源
          最近更新 更多