Can I not iterate from getDrops()?

Discussion in 'Plugin Development' started by triarry, Feb 9, 2013.

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

    triarry

    Code:
                for (Integer itemList : plugin.getConfig().getIntegerList("whitelist.items")) {
                    for (ItemStack itemStackList : event.getDrops()) {
                        if (itemStackList.getTypeId() == itemList) {
                            event.getDrops().remove(event.getDrops().indexOf(itemStackList));                   
                        }
                    }
                }
    Hi guys, I tried this code out, and I get an EventException when the second for loop runs. Is there a reason I couldn't iterate from a List<ItemStack>?

    Thanks in advance.
     
  2. Offline

    raGan.

    Stacktrace please. But basically you can't remove from the list if you are iterating through it.
     
    triarry likes this.
  3. Offline

    blablubbabc

    If it is a ConcurrentModificationException: try to use an Iterator or Create a copy of the list. You probably can't iterate and remove items from the list at the same time.

    Edit: ninja'd
     
  4. Offline

    triarry

    Code:
    12:23:42 [SEVERE] Could not pass event PlayerDeathEvent to PvP Restore v1.4
    org.bukkit.event.EventException
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:427)
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:62)
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
    ava:477)
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:462)
            at org.bukkit.craftbukkit.v1_4_R1.event.CraftEventFactory.callPlayerDeat
    hEvent(CraftEventFactory.java:332)
            at net.minecraft.server.v1_4_R1.EntityPlayer.die(EntityPlayer.java:256)
            at net.minecraft.server.v1_4_R1.EntityLiving.damageEntity(EntityLiving.j
    ava:758)
            at net.minecraft.server.v1_4_R1.EntityHuman.damageEntity(EntityHuman.jav
    a:616)
            at net.minecraft.server.v1_4_R1.EntityPlayer.damageEntity(EntityPlayer.j
    ava:309)
            at net.minecraft.server.v1_4_R1.Explosion.a(Explosion.java:171)
            at net.minecraft.server.v1_4_R1.World.createExplosion(World.java:1608)
            at net.minecraft.server.v1_4_R1.WorldServer.createExplosion(WorldServer.
    java:773)
            at net.minecraft.server.v1_4_R1.EntityTNTPrimed.explode(EntityTNTPrimed.
    java:81)
            at net.minecraft.server.v1_4_R1.EntityTNTPrimed.j_(EntityTNTPrimed.java:
    61)
            at net.minecraft.server.v1_4_R1.World.entityJoinedWorld(World.java:1332)
     
            at net.minecraft.server.v1_4_R1.WorldServer.entityJoinedWorld(WorldServe
    r.java:548)
            at net.minecraft.server.v1_4_R1.World.playerJoinedWorld(World.java:1313)
     
            at net.minecraft.server.v1_4_R1.World.tickEntities(World.java:1191)
            at net.minecraft.server.v1_4_R1.WorldServer.tickEntities(WorldServer.jav
    a:445)
            at net.minecraft.server.v1_4_R1.MinecraftServer.r(MinecraftServer.java:5
    80)
            at net.minecraft.server.v1_4_R1.DedicatedServer.r(DedicatedServer.java:2
    24)
            at net.minecraft.server.v1_4_R1.MinecraftServer.q(MinecraftServer.java:4
    94)
            at net.minecraft.server.v1_4_R1.MinecraftServer.run(MinecraftServer.java
    :427)
            at net.minecraft.server.v1_4_R1.ThreadServerApplication.run(SourceFile:8
    49)
    Caused by: java.util.ConcurrentModificationException
            at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
            at java.util.ArrayList$Itr.next(Unknown Source)
            at com.github.triarry.PvPRestore.PvPRestorePlayerListener.dropWhitelist(
    PvPRestorePlayerListener.java:317)
            at com.github.triarry.PvPRestore.PvPRestorePlayerListener.onPlayerDeath(
    PvPRestorePlayerListener.java:100)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:425)
    But okay, I'll try that.

    Code:
            List<ItemStack> itemDuplicate = event.getDrops();
            if (p.hasPermission("pvprestore.whitelist.drop") && plugin.getConfig().getBoolean("whitelist.enabled") == true) {
                for (Integer itemList : plugin.getConfig().getIntegerList("whitelist.items")) {
                    for (ItemStack itemStackList : itemDuplicate) {
                        if (itemStackList.getTypeId() == itemList) {
                            event.getDrops().remove(itemDuplicate.indexOf(itemStackList));                   
                        }
                    }
                }
            }
    I tried doing the duplicate, and I still get an error at line:

    Code:
                    for (ItemStack itemStackList : itemDuplicate) {
    But I'm not changing that anymore. So what's going on?

    Stacktrace:

    Code:
    13:33:24 [SEVERE] Could not pass event PlayerDeathEvent to PvP Restore v1.4
    org.bukkit.event.EventException
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:427)
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:62)
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
    ava:477)
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:462)
            at org.bukkit.craftbukkit.v1_4_R1.event.CraftEventFactory.callPlayerDeat
    hEvent(CraftEventFactory.java:332)
            at net.minecraft.server.v1_4_R1.EntityPlayer.die(EntityPlayer.java:256)
            at net.minecraft.server.v1_4_R1.EntityLiving.damageEntity(EntityLiving.j
    ava:758)
            at net.minecraft.server.v1_4_R1.EntityHuman.damageEntity(EntityHuman.jav
    a:616)
            at net.minecraft.server.v1_4_R1.EntityPlayer.damageEntity(EntityPlayer.j
    ava:309)
            at net.minecraft.server.v1_4_R1.Explosion.a(Explosion.java:171)
            at net.minecraft.server.v1_4_R1.World.createExplosion(World.java:1608)
            at net.minecraft.server.v1_4_R1.WorldServer.createExplosion(WorldServer.
    java:773)
            at net.minecraft.server.v1_4_R1.EntityTNTPrimed.explode(EntityTNTPrimed.
    java:81)
            at net.minecraft.server.v1_4_R1.EntityTNTPrimed.j_(EntityTNTPrimed.java:
    61)
            at net.minecraft.server.v1_4_R1.World.entityJoinedWorld(World.java:1332)
     
            at net.minecraft.server.v1_4_R1.WorldServer.entityJoinedWorld(WorldServe
    r.java:548)
            at net.minecraft.server.v1_4_R1.World.playerJoinedWorld(World.java:1313)
     
            at net.minecraft.server.v1_4_R1.World.tickEntities(World.java:1191)
            at net.minecraft.server.v1_4_R1.WorldServer.tickEntities(WorldServer.jav
    a:445)
            at net.minecraft.server.v1_4_R1.MinecraftServer.r(MinecraftServer.java:5
    80)
            at net.minecraft.server.v1_4_R1.DedicatedServer.r(DedicatedServer.java:2
    24)
            at net.minecraft.server.v1_4_R1.MinecraftServer.q(MinecraftServer.java:4
    94)
            at net.minecraft.server.v1_4_R1.MinecraftServer.run(MinecraftServer.java
    :427)
            at net.minecraft.server.v1_4_R1.ThreadServerApplication.run(SourceFile:8
    49)
    Caused by: java.util.ConcurrentModificationException
            at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
            at java.util.ArrayList$Itr.next(Unknown Source)
            at com.github.triarry.PvPRestore.PvPRestorePlayerListener.dropWhitelist(
    PvPRestorePlayerListener.java:319)
            at com.github.triarry.PvPRestore.PvPRestorePlayerListener.onPlayerDeath(
    PvPRestorePlayerListener.java:101)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:425)
    (Line 319 is the 2nd for loop, and line 101 is the place in the code where this function is called.)

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 31, 2016
  5. Offline

    raGan.

    You do not create duplicate by assigning the same thing you modify... You will have to copy(clone) that list.
    By the way, your naming is terrible. Names of your variables absolutely do not reflect what they hold.

    Edit: Rather use the code below.
     
    triarry likes this.
  6. Offline

    Tirelessly

    Use an iterator, not a copy. Example usage:
    Code:java
    1.  
    2. Iterator<String> iterator = hashsetofstrings.iterator();
    3. while(iterator.hasNext()){
    4. String s = iterator.next();
    5. if(s.equalsIgnoreCase("hi")) iterator.remove();
    6. }
    7.  
     
    triarry likes this.
  7. Offline

    triarry

    Works like a charm! Thanks a lot for the help raGan. and Tirelessly :)
     
Thread Status:
Not open for further replies.

Share This Page