我有一个ArrayList定义如下:
private List<WeakReference<BleLockConnectionListener>> connectionListeners = new ArrayList<>();
对该ArrayList的所有访问均已同步。下面的代码不时崩溃,说我在大小为1时试图访问索引1:
synchronized (connectionListeners)
{
for (int i = connectionListeners.size() - 1; i >= 0; --i)
{
WeakReference<BleLockConnectionListener> reference = connectionListeners.get(i);
BleLockConnectionListener connectionListener = reference.get();
if (connectionListener == null)
{
connectionListeners.remove(i);
}
else
{
connectionListener.connected(deviceId);
}
}
}
导致异常的行是;
WeakReference<BleLockConnectionListener> reference = connectionListeners.get(i);
但是我不明白它如何发生。如果在进入循环时大小为1,则应以i == 0开头。如果大小为2或更大,并且项被删除,则在删除之后,我应该递减,因为每次循环执行仅删除一项,我仍然应该小于尺寸。
任何人都可以提供解释吗?
我不知道size()对您的ArrayList有什么作用。
Count是一个有效的属性,用于检索ArrayList中的元素数:
for (int i = connectionListeners.Count - 1; i >= 0; --i)