[英]Exception when removing element from HashMap java.util.ConcurrentModificationException
[英]java.util.ConcurrentModificationException when adding/removing SubLists from/to lists
我通過以下方式在應用程序的ArrayList中添加/刪除項目:
public long gotoItem(int pos) {
if (pos > 0) {
List<QueueItem> mSubList = mItems.subList(0, pos);
switch (mRepeatType) {
case NO_REPEAT:
case REPEAT_SINGLE:
mPlayedItems.addAll(mSubList);
mItems.removeAll(mSubList);
break;
case REPEAT_ALL:
mItems.removeAll(mSubList);
mItems.addAll(mSubList);
break;
}
}
return (long) mItems.get(0).getItem();
}
我拋出了以下異常:
> java.util.ConcurrentModificationException at java.util.AbstractList$SubAbstractList.listIterator(AbstractList.java:314)
at java.util.AbstractList$SubAbstractList.iterator(AbstractList.java:301)
at java.util.AbstractCollection.contains(AbstractCollection.java:127)
at java.util.AbstractCollection.removeAll(AbstractCollection.java:277)
at at.guger.musixs.playback.queue.Queue.gotoItem(Queue.java:135)
at at.guger.musixs.playback.MusicService.gotoPosition(MusicService.java:500)
at at.guger.musixs.playback.MusicPlayer.gotoPosition(MusicPlayer.java:138)
at at.guger.musixs.activity.MainActivity.SyncLocation(MainActivity.java:707)
at at.guger.musixs.activity.MainActivity.access$200(MainActivity.java:73)
at at.guger.musixs.activity.MainActivity$1.onServiceConnected(MainActivity.java:605)
at at.guger.musixs.playback.MusicPlayer$ServiceBinder.onServiceConnected(MusicPlayer.java:246)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1224)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1241)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5461)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
為什么這里會發生此錯誤?如何以最簡單的方式解決此錯誤? -是否真的需要循環從數組列表中刪除(或添加)項?
謝謝!
SubList
實際上是原始列表頂部的視圖。 在內部,它仍然保留原始列表。 因此,當您調用originalList.removeAll(subList)
,它實際上會在內部迭代原始列表,並嘗試對其進行修改。 這就是為什么您得到ConcurrentModificationException
。
一個簡單的解決方案是將子列表復制到新列表(簡化示例):
List<QueueItem> subList = new ArrayList<>(items.subList(0, pos));
items.removeAll(subList);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.