首页 > 解决方案 > 无法找到数组索引超出范围异常原因

问题描述

for(int i = q.length-1; i >= 0; i--){
        if(q[i] != i+1){
            try{
                if(((i-1)>=0) & (q[i-1] == (i+1))){

                    steps++;
                    q[i-1] = q[i];

                    q[i] = i+1;
                    System.out.println("here "+i);
                }
                if(((i-2) >=0) & (q[i-2] == (i+1))){

                    q[i-2] = q[i-1];
                    q[i-1] = q[i];
                    q[i] = i+1;
                    steps += 2;
                }else{
                    System.out.println("Too chaotic");
                    return;
                }
            }catch(Exception e){
                System.out.println("error at the " +i + " exception" +e);
            }
        }
    }
    System.out.println(steps);

* i 的最后一个值,我在 catch 中是 1。我尝试在 if 条件下打印 i,它正在将 i 值打印为 1,直到最后一行。现在,我不明白异常发生在哪里?*

标签: javaarraysindexoutofboundsexception

解决方案


在第二个嵌套 if 语句中,您尝试访问q[i-2]. 但是您只有在检查 if 之后才尝试这样做i - 2 >= 0,对吗?错误的!您使用了按位 AND ( &) 而不是逻辑 AND ( &&)。

if(((i-2) >=0) & (q[i-2] == (i+1)))

如果它是逻辑 AND,则不会检查语句中的下一个条件是否i - 2小于 0,从而阻止访问q[i - 2]. 由于它是按位与,因此两个操作数都将被计算,并且q[i - 2]i = 1 处的计算会导致数组索引超出范围异常。

这就是为什么,i你得到的最后一个值是 1。

这是引发异常的充分理由,但同样的问题仍然存在于第一个嵌套 if 语句中。如果您在另一个方向上遍历数组,或者如果在i = 1. 因此,为了防止此错误,您应该将这两个都更改&&&.


推荐阅读