无法找到超出索引的异常原因

问题描述 投票:-1回答:1
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的最后一个值是1。我试图在if条件下打印i,并且将i值打印为1直到最后一行。现在,我不知道异常发生在哪里?*

java arrays indexoutofboundsexception
1个回答
0
投票

在第二个if语句内,您尝试访问q[i-2]。但是,只有在检查i - 2 >= 0是否正确之后,您才尝试这样做?错误!您已使用按位与(&)代替了逻辑与(&&)。

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

如果是逻辑与,则如果i - 2小于0,则不会检查语句中的下一个条件,从而阻止了对q[i - 2]的访问。由于它是按位与,因此将对两个操作数都进行求值,并且i = 1时q[i - 2]的求值导致数组索引超出范围异常。这就是为什么您获得的i的最后一个值为1。

这是引发异常的充分原因,但是第一个nested-if语句仍然存在相同的问题。如果您在另一个方向上遍历数组,可能是由此引起的。因此,为了防止发生此错误,应将两个&都更改为&&

© www.soinside.com 2019 - 2024. All rights reserved.