【问题标题】:ConcurrentModificationException when getting strings获取字符串时出现 ConcurrentModificationException
【发布时间】:2016-07-16 07:16:10
【问题描述】:

对于我正在编码的 bukkit 插件,我需要从文件中获取所有玩家权限,我不想要以“-”开头的权限,因为这些权限是在另一种方法中调用的(要从玩家中删除的权限)但是我在 for(String perms : s){

处收到 ConcurrentModificationException 异常
public static List<String> getPerms(Player player){
    File f = new File(ServerCore.getPlugin().getDataFolder(), "permissions.yml");
    FileConfiguration rankData = YamlConfiguration.loadConfiguration(f);
    List<String> s = rankData.getStringList("Permissions.ranks."+ getPlayerRank(player) + ".permissions");
    for(String ss : getInheritance(player)){
        try{
            List<String> sss = rankData.getStringList("Permissions.ranks." + ss + ".permissions");
            s.addAll(sss);
        }catch(Exception e){
            e.printStackTrace();
        }

    }
    List<String> results = s;
    for(String perms : s){
        if(!perms.startsWith("-")){
            results.add(perms);
        }
    }
    return results;
}

【问题讨论】:

    标签: java bukkit


    【解决方案1】:
     List<String> results = s;
    

    您正在迭代的列表“s”与您正在向其中添加元素的“结果”相同。在迭代时使用快速失败迭代器(大多数非并发集合)修改集合将引发该异常。

    从上下文来看,我假设你真正想要的是类似的东西

     List<String> results = new ArrayList();
    

    【讨论】:

      【解决方案2】:

      克隆原始列表,然后使用它。否则,您正在修改相同的引用,因此会出现异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-24
        • 2022-10-25
        • 2012-09-14
        • 2016-03-29
        • 1970-01-01
        • 2021-03-30
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多