有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

bukkit java。util。ConcurrentModificationException错误

我最近在运行runnable时遇到了一个错误,runnable更新了矿车的位置Main.UvehicleLocation2是一个HashMap

[22:36:59] [Craft Scheduler Thread - 607/WARN]: Exception in thread "Craft Scheduler Thread - 607" 
[22:36:59] [Craft Scheduler Thread - 607/WARN]: org.apache.commons.lang.UnhandledException: Plugin CreativeControlByKubqoA v2.2.3 generated an exception while executing task 3019245
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:56)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1429)
at java.util.HashMap$KeyIterator.next(HashMap.java:1453)
at java.util.AbstractCollection.toArray(AbstractCollection.java:141)
at java.util.ArrayList.<init>(ArrayList.java:177)
at me.kubqoa.creativecontrol.tasks.VehiclesUpdateDB.run(VehiclesUpdateDB.java:19)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftTask.run(CraftTask.java:71)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53)
... 3 more

以下是代码:

@Override
public void run() {
    List<Location> locations1 = new ArrayList<Location>(Main.UvehiclesLocation2.keySet());
    for (Location location : locations1) {
        VehicleHelper.updateVehicle(location,Main.UvehiclesLocation2.get(location));
    }
}

共 (1) 个答案

  1. # 1 楼答案

    Main.UvehiclesLocation2.keySet()正在被更改,而您正在将其复制到新的数组列表中

    复制该实例时,您要么需要独占访问该实例(例如,使用synchronized块),要么可以将Main.UvehiclesLocation2改为ConcurrentHashMapFrom the Javadoc

    The view's iterator is a "weakly consistent" iterator that will never throw ConcurrentModificationException, and guarantees to traverse elements as they existed upon construction of the iterator, and may (but is not guaranteed to) reflect any modifications subsequent to construction.