Во время работы на некоторых Java проекта я столкнулся с этой своеобразной ошибки:Java - Index Out Of Bounds Exception: индекс: 1, размер: 2
java.lang.IndexOutOfBoundsException: Index: 1, Size: 2
Как может быть индекс из исключения ограничивает? Индекс 1 означает, что он пытается получить второй элемент, размер 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 минут). Так что я пытался придумать метод, чтобы иметь электронную контрольную точку, когда клетка равна нулю, так что я придумал этот код:
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))
Почему? Как можно исключить индекс из связанного исключения, если, по-видимому, индекс находится в границах?
Edit: изменена ошибка в копировании кода
Update: Я пытался понять, почему исключения нулевого указателя появляется с TRY/поймать и поставить точку останова. Кажется, что cellWithAgents иногда содержат нуль. Это, скорее всего, из-за параллелизма, как заявил @rlinden.
О параллелизме: есть некоторые ячейки, которые могут содержать агентов. Существует переменное количество агентов, которые могут перемещаться между ячейками. Существует специальный агент, который пытается подсчитать количество движущихся агентов (используя эту функцию). Таким образом, только один агент (поток) может использовать эту функцию, но несколько агентов могут изменять ячейки (и, таким образом, беспорядок с результатами getNonEmptyCells() и howManyAgents()).
Тем не менее, как можно получить индекс за пределы с размером 2 и индексом 1? Это невозможно из-за параллелизма, не так ли? Потому что только этот поток может изменить список cellWithAgents. Таким образом, даже если один из элементов в списке становится нулевым, список все еще содержит это количество указателей, поэтому размер списка не может измениться. Или это может быть так, что я скучаю? И как можно объяснить, что трассировка трассировки стека Индекс: 1 Размер: 2?
Установка точки останова на линии, на которую вы положили ее, бесполезна. Ошибка возникает при попытке доступа к индексу 'i'th, которого не существует. Что касается _why_, это за гранью, я буду продолжать смотреть. – Arc676
Почему ваше нулевое сравнение между ячейкамиWithType? – rlinden
AS для того, как это исключение происходит, вне меня, однако то, что бросается в глаза, это: вы перебираете ячейки с помощью агентов, но используете этот индекс для доступа к CellsWithTypes. – bwright