NullPointerException Error

Discussion in 'Plugin Development' started by Rident, Feb 15, 2017.

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

    Rident

    I'm trying to write a plugin that whenever someone crafts a certain type of item, such as pickaxes, swords, chestplates etc.. that it adds 'Crafted by <player-name>', but I keep getting an NullPointerException error. Someone explained that I have to find the ItemMeta before I can say that it is equal to Null, which I thought would be easy at first, but I can't figure it out for the life of me. If someone could show me how it's done, that would be greatly appreciated!

    Code:
    @EventHandler
    public void onCraftingItem(PrepareItemCraftEvent e) {
    ItemStack result = e.getInventory().getResult();
    ItemMeta itemMeta = result.getItemMeta();
    List<String> lore = itemMeta.getLore();
    if (result.getType().name().contains("SWORD") && lore == null) {
    lore = new ArrayList<String>();
    }
    Player p = (Player)e.getInventory().getHolder();
    lore.add("crafted by " + p.getName());
    itemMeta.setLore(lore);
    result.setItemMeta(itemMeta);
    e.getInventory().setResult(result);
    
    }
    
     
    Last edited: Feb 16, 2017
  2. Offline

    Zombie_Striker

    @Rident
    What line exactly is throwing the NPE?
     
  3. Offline

    Rident

    @Zombie_Striker
    I believe it's line 24? but I'm not entirely sure. I posted the error I get below, thanks for helping by the way!

    Edit: Line 24 is: lore.add("crafted by " + p.getName());

    Code:
    [23:50:56 ERROR]: Could not pass event PrepareItemCraftEvent to CraftedBy v0.42
    org.bukkit.event.EventException
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at org.bukkit.craftbukkit.v1_10_R1.event.CraftEventFactory.callPreCraftEvent(CraftEventFactory.java:765) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.CraftingManager.craft(CraftingManager.java:314) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.ContainerWorkbench.a(ContainerWorkbench.java:57) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.InventoryCrafting.setItem(InventoryCrafting.java:120) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.Slot.set(Slot.java:58) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventoryView.setItem(CraftInventoryView.java:54) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.Container.a(Container.java:200) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.PlayerConnection.a(PlayerConnection.java:1822) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.PacketPlayInWindowClick.a(SourceFile:33) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.PacketPlayInWindowClick.a(SourceFile:10) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_121]
            at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_121]
            at net.minecraft.server.v1_10_R1.SystemUtils.a(SourceFile:45) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.MinecraftServer.D(MinecraftServer.java:732) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:400) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:668) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:567) [spigot-1.10.jar:git-Spigot-de459a2-51263e9]
            at java.lang.Thread.run(Unknown Source) [?:1.8.0_121]
    Caused by: java.lang.NullPointerException
            at rident.github.io.CraftedBy.CraftingItemListener.onCraftingItem(CraftingItemListener.java:24) ~[?:?]
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_121]
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_121]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_121]
            at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_121]
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.10.jar:git-Spigot-de459a2-51263e9]
    
     
    Last edited: Feb 15, 2017
  4. Offline

    Drkmaster83

    @Rident Try null-checking before you do result.getType(), because what if there is no result? I doubt it's the p.getName().
     
  5. Offline

    Rident

    @Drkmaster83 If I add the 'if' statement below to before the 'result.getType', I still get a NullPointerException error for the same line.

    Code:
    ItemStack result = e.getInventory().getResult();
    ItemMeta itemMeta = result.getItemMeta();
    
    if (itemMeta.equals(null)) {
            if (result.getType().name().contains("SWORD") && lore == null) {
            lore = new ArrayList<String>();
            }
    }
    
     
  6. Offline

    MaxFireIce

    @Rident You should null check anything that may return null in a certain scenario, especially with event listeners and command arguments ;).
     
  7. Offline

    timtower Administrator Administrator Moderator

    @Rident result can be null
    itemmeta can be null
     
  8. Offline

    Rident

    @timtower so I should check if both itemMeta and result are null then? If I do the 'if' statement below, I no longer get errors, but it doesn't add 'Crafted by <player-name>' anymore.

    Edit: I guess since I'm checking if result is null, it doesn't give me anything? perhaps.
    Edit 2: Also, if I do 'result == null' instead of 'result.equals(null)' I get a dead code error.

    Code:
        if (result.equals(null) && itemMeta.equals(null)) {
            if (result.getType().name().contains("SWORD") && lore == null) {
                lore = new ArrayList<String>();
            }
        }
    
     
  9. Offline

    timtower Administrator Administrator Moderator

    @Rident All null checks should be ==
     
  10. Offline

    Rident

    I just edited my last post, but whenever I do 'result == null' instead of 'result.equals(null)' I get a dead code error.
     
  11. Offline

    timtower Administrator Administrator Moderator

    @Rident Post the full method please.
     
  12. Offline

    Rident

    @timtower

    Here's everything I've got thus far.

    Show Spoiler

    Code:
    package rident.github.io.CraftedBy;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.inventory.PrepareItemCraftEvent;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class CraftedBy extends JavaPlugin {
      
        @EventHandler
        public void onCraftingItem(PrepareItemCraftEvent e) {
        ItemStack result = e.getInventory().getResult();
        ItemMeta itemMeta = result.getItemMeta();
        List<String> lore = itemMeta.getLore();
      
        if (result.equals(null) && itemMeta.equals(null)) {
            if (result.getType().name().contains("SWORD") && lore == null) {
                lore = new ArrayList<String>();
            }
        }
      
        Player player = (Player)e.getInventory().getHolder();
        lore.add(ChatColor.WHITE + "Crafted by " + player.getName());
        itemMeta.setLore(lore);
        result.setItemMeta(itemMeta);
        e.getInventory().setResult(result);
    
        }
    }
    
     
  13. Offline

    timtower Administrator Administrator Moderator

    @Rident Get the result, do a null check on that.
    result.hasItemMeta()
    Get the itemmeta if above is true
    itemmeta.hasLore
    get lore if there

    Don't forget to do your sword check though.
     
  14. Offline

    Rident

    So something like this then?

    Edit: That code solved my NPE error, but now nothing has 'Crafted by <player-name>' on it. I'm going to try changing the '.name.contains("SWORD")' to an actual material, to see if that works.

    Code:
        if (result.hasItemMeta() && result.getItemMeta() == null && result.getType().name().contains("SWORD")); {
            if (itemMeta.hasLore() && lore == null) {
                lore = new ArrayList<String>();
            }
        }
    
    Edit 2: I was able to figure it out. I didn't end up having to check if anything was null. Supposedly because I had written 'List<String> lore = itemMeta.getLore();' and had 'lore = new ArrayList<String>();' whenever the result had the word "SWORD" in it, it would cause 'lore.add(ChatColor.WHITE + "Crafted by " + player.getName());' to spew out the NPE error. I changed 'List<String> lore = itemMeta.getLore();' to 'List<String> lore = new ArrayList<>();' and added 'lore.add(ChatColor.WHITE + "Crafted by " + player.getName());' to my 'if' statement, which solved everything!
     
    Last edited: Feb 17, 2017
Thread Status:
Not open for further replies.

Share This Page