找不到aray索引超出界限的异常原因


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,直到最后一行。现在,我不明白异常发生在哪里?*

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

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

如果是逻辑AND,则如果i - 2小于0,则不会检查语句中的下一个条件,从而阻止对q[i - 2]的访问。由于它是按位AND,因此将计算两个操作数,并且在i=1时对q[i - 2]的求值会导致Array Index Out of Bound异常。

这就是为什么,您在catch中得到的i的最后一个值是1。

这是抛出异常的充分理由,但第一个嵌套的if语句也存在同样的问题。如果您在另一个方向上遍历阵列,或者如果i = 1没有问题,则可能是由这种情况引起的。因此,为了防止此错误,您应该将这两个&都更改为&&

最新更新