Solved ConcurrentModificationException

Discussion in 'Plugin Development' started by cfil360, Apr 13, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    cfil360

    When i attempt to remove my player from the arena it errors, giving me a ConcurrentModificationException. It works when i call this method from the onDisable method, but it throws the error when i attempt to call it from the onCommand.

    StackTrace
    Code:
    [15:37:23 WARN]: java.util.ConcurrentModificationException
    [15:37:23 WARN]:        at java.util.ArrayList$Itr.checkForComodification(Unknow
    n Source)
    [15:37:23 WARN]:        at java.util.ArrayList$Itr.next(Unknown Source)
    [15:37:23 WARN]:        at me.connor.kitminigame.ArenaManager.endArena(ArenaMana
    ger.java:172)
    [15:37:23 WARN]:        at me.connor.kitminigame.commands.ForceEnd.onCommand(For
    ceEnd.java:41)
    [15:37:23 WARN]:        at me.connor.managers.CommandManager.onCommand(CommandMa
    nager.java:61)
    [15:37:23 WARN]:        at org.bukkit.command.PluginCommand.execute(PluginComman
    d.java:44)
    [15:37:23 WARN]:        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCo
    mmandMap.java:180)
    [15:37:23 WARN]:        at org.bukkit.craftbukkit.v1_7_R2.CraftServer.dispatchCo
    mmand(CraftServer.java:719)
    [15:37:23 WARN]:        at net.minecraft.server.v1_7_R2.PlayerConnection.handleC
    ommand(PlayerConnection.java:984)
    [15:37:23 WARN]:        at net.minecraft.server.v1_7_R2.PlayerConnection.a(Playe
    rConnection.java:829)
    [15:37:23 WARN]:        at net.minecraft.server.v1_7_R2.PacketPlayInChat.a(Packe
    tPlayInChat.java:28)
    [15:37:23 WARN]:        at net.minecraft.server.v1_7_R2.PacketPlayInChat.handle(
    PacketPlayInChat.java:65)
    [15:37:23 WARN]:        at net.minecraft.server.v1_7_R2.NetworkManager.a(Network
    Manager.java:148)
    [15:37:23 WARN]:        at net.minecraft.server.v1_7_R2.ServerConnection.c(Serve
    rConnection.java:77)
    [15:37:23 WARN]:        at net.minecraft.server.v1_7_R2.MinecraftServer.v(Minecr
    aftServer.java:705)
    [15:37:23 WARN]:        at net.minecraft.server.v1_7_R2.DedicatedServer.v(Dedica
    tedServer.java:273)
    [15:37:23 WARN]:        at net.minecraft.server.v1_7_R2.MinecraftServer.u(Minecr
    aftServer.java:568)
    [15:37:23 WARN]:        at net.minecraft.server.v1_7_R2.MinecraftServer.run(Mine
    craftServer.java:474)
    [15:37:23 WARN]:        at net.minecraft.server.v1_7_R2.ThreadServerApplication.
    run(SourceFile:618)
    >
    End Arena Method
    Code:java
    1. //A method for ending an Arena:
    2. public void endArena(String arenaName) {
    3.  
    4. if (getArena(arenaName) != null) { //If the arena exsists
    5.  
    6. Arena arena = getArena(arenaName); //Create an arena for using in this method
    7.  
    8. //Send them a message
    9. arena.sendMessage(ChatColor.GOLD + "The arena has ended :(");
    10.  
    11. //Set ingame
    12. arena.setInGame(false);
    13.  
    14. for (String s: arena.getPlayers()) {//Loop through every player in the arena;
    15. //Teleport them:
    16.  
    17. Player player = Bukkit.getPlayer(s); //Create a player by the name
    18. player.teleport(arena.getLobbyLocation());
    19.  
    20. player.getInventory().clear(); //Clear the players inventory
    21. player.setHealth(player.getMaxHealth()); //Heal the player
    22. player.setFireTicks(0); //Heal the player even more ^ ^ ^
    23.  
    24. arena.sendMessage(arenaName);
    25. //Remove them all from the list
    26. removePlayer(player, arena.getName());
    27. arena.sendMessage("test5");
    28. }
    29. }
    30. }


    Command
    Code:java
    1. public void onCommand(Player p, String[] args) {
    2. if(!p.hasPermission("spleef.admin")) {
    3. MessageManager.getInstance().severe(p, "You don't have permission to force end spleef arenas!");
    4. return;
    5. }
    6.  
    7. if(args == null) {
    8. MessageManager.getInstance().severe(p, "You must specify a name for the arena!");
    9. return;
    10. }
    11.  
    12. if(args.length == 0) {
    13. MessageManager.getInstance().severe(p, "Usage: /spleef forceEnd [name]");
    14. return;
    15. }
    16.  
    17. if(args.length > 1) {
    18. MessageManager.getInstance().severe(p, "Arenas can only be 1 word!");
    19. return;
    20. }
    21.  
    22. //define a variable for the arena name
    23. String arena = args[0];
    24.  
    25. //test if the arena already exists or not
    26. if(!SettingsManager.getInstance().arenas.contains(arena)) {
    27. MessageManager.getInstance().severe(p, "The arena " + ChatColor.AQUA + arena + ChatColor.RED + " does not exist!");//test to see if the arena already exists.
    28. return;
    29. }
    30.  
    31. ArenaManager.getManager().endArena(arena);//force end the arena
    32. }
     
  2. Offline

    MOMOTHEREAL

    Code:
    at me.connor.kitminigame.ArenaManager.endArena(ArenaMana
    ger.java:172)
    What's line 172 of ArenaManager?
     
  3. Offline

    cfil360

    MOMOTHEREAL
    Sorry the end arena method line numbers don't line up. It is this part of that method.
    Code:java
    1. for (String s: arena.getPlayers()) {//Loop through every player in the arena;
     
  4. Offline

    amhokies

    cfil360
    It's happening because you're trying to remove an element of a Collection from within the enhanced for loop. Consider using an iterator, and that should remedy the issue.
     
  5. Offline

    cfil360

    amhokies but why doesn't it throw the error from the onDisable method?
     
  6. Offline

    amhokies

    There's a possibility that it isn't looping when being called in the onDisable method. I don't know for sure, but I know it's what is causing the error.
     
  7. Offline

    cfil360

    amhokies I understand that, but how can it work in the onDisable, but not the command. Also how can i fix this, while still update the arena player list?
     
  8. Offline

    amhokies

    As I just said, I don't know why it is working in the disable. It's really hard to tell without being able to see console output, your code, etc. Use an iterator to iterate through the elements instead and the problem will be fixed.
     
  9. Offline

    cfil360

    amhokies Im confused as what u mean use an iterator. It is already iterating through the player list.
     
  10. Offline

    amhokies

    cfil360 likes this.
  11. Offline

    cfil360

  12. Offline

    SmellyPenguin

    You might want to use getPlayerExact(String) instead of getPlayer(String)
     
Thread Status:
Not open for further replies.

Share This Page