【发布时间】:2016-04-09 09:14:28
【问题描述】:
在处理一些 java 项目时,我遇到了这个奇怪的错误:
java.lang.IndexOutOfBoundsException: Index: 1, Size: 2
怎么会有索引越界异常?索引 1 表示它试图获取第二个元素,大小 2 表示有 2 个元素,所以应该没有问题,不是吗?
上下文:
我有以下功能:
public int howManyAgents(){
// cell is a class that can have 0 or multiple objects
// I get a list of cells that contain at least 1 agent
List<Cell> cellsWithAgents = getNonEmptyCells();
// initializing a counter
int agentsCount = 0;
for(int i=0; i<cellsWithAgents.size(); i++){
// For every cell in the list I add to the counter the number of
// agents that cell contains
agentsCount += cellsWithAgents.get(i).howManyAgents();
}
return agentsCount;
}
现在,问题是我在该行遇到了一个空指针异常:
agentsCount += cellsWithAgents.get(i).howManyAgents();
我想调试代码,但是这个函数在程序运行时被多次调用,并且空指针异常出现在不同的时间点(1分钟后10秒后5分钟后)。所以我试图想出一种方法来在单元格为空时设置断点,所以我想出了这个代码:
public int howManyAgents(){
// cell is a class that can have 0 or multiple objects
// I get a list of cells that contain at least 1 agent
List<Cell> cellsWithAgents = getNonEmptyCells();
// initializing a counter
int agentsCount = 0;
for(int i=0; i<cellsWithAgents.size(); i++){
int pass;
if (null == cellsWithAgents.get(i))
pass = 1; // breakpoint here
// For every cell in the list I add to the counter the number of
// agents that cell contains
agentsCount += cellsWithAgents.get(i).howManyAgents();
}
return agentsCount;
}
当然,这不是最好的方法。最合乎逻辑的方法是用 try/catch 包围代码并将断点放在那里。关键是上面的代码不起作用。它并没有在断点处停止,而是在该行将索引抛出边界异常:
if (null == cellsWithAgents.get(i))
为什么?如果索引显然在范围内,怎么可能抛出索引超出范围异常?
编辑:更改了复制代码的错误
更新: 我试图看看为什么空指针异常出现在 try/catch 中,并在那里放置了一个断点。似乎 cellsWithAgents 有时包含一个空值。这很可能是因为@rlinden 所说的并发性。
关于并发:有些单元格可以包含代理。可以在单元之间移动的代理数量不定。有一个特殊的代理试图计算有多少移动代理(使用此功能)。 因此,只有一个代理(线程)可以使用此功能,但多个代理可以修改单元格(从而弄乱 getNonEmptyCells() 和 howManyAgents() 结果)。
不过,如何使索引超出大小 2 和索引 1 的范围?由于并发性,这是不可能的,是吗?因为只有这个线程可以改变列表cellsWithAgents。因此,即使列表中的元素之一变为空,列表仍然包含该数量的指针,因此列表的大小无法更改。或者它可以以某种我想念的方式? 以及如何解释堆栈跟踪打印 Index:1 Size: 2?
【问题讨论】:
-
在你放的那一行放断点是没用的。当您尝试访问不存在的
ith 索引时会发生错误。至于为什么会越界,我会继续寻找。 -
为什么你的cellWithType之间的比较是空的?
-
至于这个异常是如何发生的,我无法理解,但吸引我眼球的是:你迭代了 cellsWithAgents,但使用该索引来访问 CellsWithTypes。
-
是的,这是复制代码时的错误。我已经修复它,它是相同的列表 cellsWithAgents。
-
@Arc676 起初我有一个空指针异常,这就是我尝试这样做的原因,但后来我得到了一个索引越界异常。就好像它以某种方式改变了一样。我现在真的不知道,这就是发生的事情。
标签: java nullpointerexception indexoutofboundsexception