java - 无法找到数组索引超出范围异常原因
问题描述
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,直到最后一行。现在,我不明白异常发生在哪里?*
解决方案
在第二个嵌套 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
. 因此,为了防止此错误,您应该将这两个都更改&
为&&
.
推荐阅读
- python-3.x - Python 的 tkinter 窗口是否有 onload 事件?
- node.js - Console.log(err) 使我的网站崩溃
- reactjs - 未找到 Webpack-hot-middleware/client 模块
- sql-server - 在 SQL Server 中筛选日期时间列
- html - 是否可以只滚动一个 div,但不能滚动整个页面,除非您滚动到该 div 之外?
- proxy - 如何在 CAM 中设置代理服务器以从互联网上提取 CAM 模板?
- javascript - Gulp 不会覆盖 JS 文件
- c++ - 如何使用 Eigen 和 long double?
- python - 在熊猫数据框中查找特定部分字符串第一次出现的索引位置
- android - setFirestoreSettings 的问题