gpt4 book ai didi

Java - 索引越界异常 : Index: 1, 大小:2

转载 作者:行者123 更新时间:2023-11-30 06:56:12 25 4
gpt4 key购买 nike

在处理一些 java 项目时,我遇到了这个奇怪的错误:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 2

怎么会出现索引越界异常呢? Index 1 意味着它试图获取第二个元素,Size 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();

我想调试代码,但是这个函数在程序运行过程中被多次调用,空指针异常出现在不同的时间点(10秒后1分钟后5分钟后)。所以我试图想出一种方法来在单元格为 null 时设置断点,所以我想出了这段代码:

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?

最佳答案

新想法

尝试更改循环并查看错误是否仍然存在:

int agentsCount = 0;
for(Cell cell : getNonEmptyCells()) {
if(cell != null) {
agentsCount += cell.howManyAgents();
} else {
System.out.println("Found a null cell");
}
}

关于Java - 索引越界异常 : Index: 1, 大小:2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34613502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com