Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

I'm working on a command for a bukkit plugin that lets you transfer worlds. In the section about saving the player's inventory, I'm getting a runtime error. My question is: Why is the error happening, and how can I prevent it?

The plugin code

        public void savePlayerInv(Player p, World w){
        File playerInvConfigFile = new File(plugin.getDataFolder() + File.separator + "players" + File.separator + p.getName(), "inventory.yml");
        FileConfiguration pInv = YamlConfiguration.loadConfiguration(playerInvConfigFile);
        PlayerInventory inv = p.getInventory();
        int i = 0;

        for (ItemStack stack : inv.getContents()) {
            //increment integer
            i++;
            String startInventory = w.getName() + ".inv." + Integer.toString(i);

            //save inv
            pInv.set(startInventory + ".amount", stack.getAmount());
            pInv.set(startInventory + ".durability", Short.toString(stack.getDurability()));
            pInv.set(startInventory + ".type", stack.getTypeId());
            //pInv.set(startInventory + ".enchantment", stack.getEnchantments());
            //TODO add enchant saveing
        }

        i = 0;
        for (ItemStack armor : inv.getArmorContents()){
                i++;
                String startArmor = w.getName() + ".armor." + Integer.toString(i);

                //save armor
                pInv.set(startArmor + ".amount", armor.getAmount());
                pInv.set(startArmor + ".durability", armor.getDurability());
                pInv.set(startArmor + ".type", armor.getTypeId());
                //pInv.set(startArmor + ".enchantment", armor.getEnchantments());
        }

        //save exp
        if (p.getExp() != 0) {
                pInv.set(w.getName() + ".exp", p.getExp());
        }
    }

The offending line

The stack trace complains about line 130, which is this line.

pInv.set(startInventory + ".amount", stack.getAmount());

The stack trace

2012-03-21 13:23:25 [SEVERE] null
org.bukkit.command.CommandException: Unhandled exception executing command 'wtp' in plugin Needs v1.0
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:42)
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:166)
at org.bukkit.craftbukkit.CraftServer.dispatchCommand(CraftServer.java:461)
at net.minecraft.server.NetServerHandler.handleCommand(NetServerHandler.java:818)
at net.minecraft.server.NetServerHandler.chat(NetServerHandler.java:778)
at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:761)
at net.minecraft.server.Packet3Chat.handle(Packet3Chat.java:33)
at net.minecraft.server.NetworkManager.b(NetworkManager.java:229)
at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:112)
at net.minecraft.server.NetworkListenThread.a(NetworkListenThread.java:78)
at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:554)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:452)
at net.minecraft.server.ThreadServerApplication.run(SourceFile:490)
    Caused by: java.lang.NullPointerException
at com.devoverflow.improved.needs.commands.CommandWorldtp.savePlayerInv(CommandWorldtp.java:130)
at com.devoverflow.improved.needs.commands.CommandWorldtp.onCommand(CommandWorldtp.java:60)
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:40)
... 12 more
share|improve this question
    
You aren't asking anything. –  michael.bartnett Mar 21 '12 at 21:16
1  
ohh yeah right... why is the error happening and how can i stop it –  HcgRandon Mar 21 '12 at 21:25
3  
You might consider asking this in a Bukkit-centric website/forum. Not many people know Bukkit here. –  kaoD Mar 21 '12 at 23:17
    
Ask the MinecraftForum.net Mod Development forum. –  Jonathan Hobbs Mar 22 '12 at 0:04

1 Answer 1

up vote 2 down vote accepted

I have seen this before and I am pretty sure that its because you are getting every item in inventory including the empty ones which return null. inv.getContents() gets everything. Add an if statement inside your for loop to check that they arent null before doing anything with the item.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.