首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加一个书签时java.util.ConcurrentModification出错

添加一个书签时java.util.ConcurrentModification出错
EN

Stack Overflow用户
提问于 2016-08-22 07:43:40
回答 3查看 52关注 0票数 0

当我添加最后的第7项位置时,我遇到了问题,其他6项与自动删除whenhasEnded完美地工作。我不能添加第7项,当我得到其他项目(如1-6和添加第7项)时,我的应用程序出现了错误:

代码语言:javascript
复制
java.util.ConcurrentModificationException

一是密码:

代码语言:javascript
复制
 public List<LiveTvProgram> getLiveTvBookmarks() {
    String name = context.getString(R.string.preferences_bookmarks_live_tv);
    Set<String> bookmarks = preferenceHelper.getStringSet(name, name);
    ArrayList<LiveTvProgram> bookmarkList = new ArrayList<>();
    for (String title : bookmarks) {
        for (LiveTvProgram program : ChannelsManager.getInstance().getSelectedPrograms()) {
            if (program.getTitle().equals(title)) {
                if (program.hasEnded()) {
                    bookmarks.remove(title);
                } else {
                    bookmarkList.add(program);
                }
                break;
            }
        }
    }
    return bookmarkList;
}

具有第一个for循环

代码语言:javascript
复制
for (String title : bookmarks) {
        for (LiveTvProgram program : ChannelsManager.getInstance().getSelectedPrograms()) {
            if (program.getTitle().equals(title)) {
                if (program.hasEnded()) {
                    bookmarks.remove(title);
                } else {
                    bookmarkList.add(program);
                }
                break;
            }
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-22 08:01:36

您得到这个异常是因为您在通过调用bookmarks迭代列表bookmarks.remove(title)时试图修改它。请看一下这个问题的答案,看看如何避免这个问题:How to avoid java.util.ConcurrentModificationException when iterating through an removing elements from an ArrayList

附带说明:您确定确实需要从bookmarks列表中删除项目吗?在方法中通过调用

代码语言:javascript
复制
Set<String> bookmarks = preferenceHelper.getStringSet(name, name);

而且,由于您在迭代之后不会对这个列表做任何事情,所以您可以直接删除。

更新:--重写循环的快速通用建议:

代码语言:javascript
复制
for (LiveTvProgram program : ChannelsManager.getInstance().getSelectedPrograms()) {
    //Check if this program is in your bookmarks. As bookmarks is 
    //a Set, contains should be quite efficient
    if (bookmarks.contains(program.getTitle()) {                
        bookmarkList.add(program);
        //further improvement: you could check here if all bookmarks 
        //have been matched and exit the loop if yes
    }
}

如果确实需要清理bookmarks列表,则需要保留在此循环之后未包含在bookmarkList中的所有条目。

票数 2
EN

Stack Overflow用户

发布于 2016-08-22 07:51:38

不能在列表上迭代并修改它,它总是会导致ConcurrentModificationException。

因此,您的代码是不正确的,您不能在书签上迭代并删除循环中的其中一个元素。

代码语言:javascript
复制
for (String title : bookmarks) {
        for (LiveTvProgram program : ChannelsManager.getInstance().getSelectedPrograms()) {
            if (program.getTitle().equals(title)) {
                if (program.hasEnded()) {
                    bookmarks.remove(title);//FORBIDDEN !!!
                } else {
                    bookmarkList.add(program);
                }
                break;
            }
        }
    }

使用工作示例更新的 :

代码语言:javascript
复制
    List<String> bookmarksToRemoved = new ArrayList<>();
    for (String title : bookmarks) {
            for (LiveTvProgram program : ChannelsManager.getInstance().getSelectedPrograms()) {
                if (program.getTitle().equals(title)) {
                    if (program.hasEnded()) {
                        bookmarksToRemoved.add(title);//keep them in a temporary list
                    } else {
                        bookmarkList.add(program);
                    }
                    break;
                }
            }
        }
    bookmarks.removeAll(bookmarksToRemoved);//remove all bookmarks to be removed

致以敬意,

罗伊克

票数 0
EN

Stack Overflow用户

发布于 2016-08-22 08:16:30

不能为每个循环删除正在迭代的列表中的项。因此,为了更好的解决方案,请忽略这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39073861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档