Предположим следующую ситуацию в цикле:размер списка имеет неожиданное значение
LinkedList<String> myList = someMethodReturnsList();
int start = 0, end = 0;
while (end < myList.size() && someOtherCondition)
++end;
List<String> subList = myList.sublist(start, end);
... (do stuff and possibly alter list)
start = end;
Я с ситуацией, когда только иногда, что вызов sublist
сгенерирует IndexOutOfBoundsException
. Учитывая мой первый тест end < myList.size()
, это смутило меня, поэтому я написал несколько отладочных кодов. Мой отлаживать код сказал мне, что где-то между while
петлей и вызывающей sublist
, моя end
значения заканчивало тем, что 34 в то время как myList.size()
возвращался 33.
Как это вообще возможно? В моей программе нет других потоков, которые могут работать в этом списке, так как мой цикл проверки прошел и увеличил end
до 34?
EDIT: это происходит последовательно в конкретной точке выполнения моего кода, поэтому это не ошибка, но это не происходит с каждым входом, который имеет эта функция, что делает ее еще более странной.
Единственное логическое объяснение заключается в том, что либо someOtherCondition изменяет List, либо someMethodReturnsList сохраняет ссылку на Список и модифицирует его. – VGR
Оба звука звучат логично. Однако 'someMethodReturnsList' всегда создает экземпляр' new', а 'someOtherCondition' просто проверяет свойство (только чтение) из' end'th элемента 'myList'. – 2mac
Интересно. Можно ли включить эти два? И, кстати, 'LinkedList' определенно не является хорошим классом для выполнения' myList.get (end) 'и' myList.subList'. – Marwin