Stopping NPE On Custom Death Message Plugin

Discussion in 'Plugin Development' started by Mee8a, Sep 15, 2015.

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

    Mee8a

    Hey all,

    So im trying to stop some spammy error logs in my console.
    I have a custom death message plugin I have coded and I have it setup to use placeholders. However when their is no player killing the other player it creates an annoying error in the console.

    Here is the code and error message.

    Thanks in advance!
    DeathMsg.java (open)

    Code:
    package me.Mee8a.playermessage;
    
    import org.bukkit.Bukkit;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    
    public class DeathMessage implements Listener{
     
        Core pl;
     
        public DeathMessage(Core instance) {
            pl = instance;
        }
     
        @EventHandler
        public void onDeath(PlayerDeathEvent e) {
            String death_message = pl.getConfig().getString("DEATH_MESSAGE");
            e.setDeathMessage(null);
         
            Player p = e.getEntity();
            if(e.getEntity().getKiller() == null) {
                return;
            }
            death_message = death_message.replaceAll("%killer%", p.getKiller().getName());
            death_message = death_message.replaceAll("%name%", p.getName());
         
            Bukkit.broadcastMessage(death_message);
         
        }
    
    }
    


    latest.log (open)

    Code:
    [18:40:56] [Server thread/ERROR]: Could not pass event PlayerDeathEvent to MGMCDeathHandler v1.0.0
    org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:501) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:486) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.callPlayerDeathEvent(CraftEventFactory.java:365) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.EntityPlayer.die(EntityPlayer.java:402) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.EntityLiving.damageEntity(EntityLiving.java:801) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.EntityHuman.damageEntity(EntityHuman.java:794) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.EntityPlayer.damageEntity(EntityPlayer.java:481) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.EntityLiving.e(EntityLiving.java:928) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.EntityHuman.e(EntityHuman.java:1434) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.Block.a(Block.java:636) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.Entity.a(Entity.java:793) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.EntityLiving.a(EntityLiving.java:151) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.EntityPlayer.a(EntityPlayer.java:606) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:440) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.PacketPlayInFlying.a(SourceFile:126) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.PacketPlayInFlying$PacketPlayInPosition.a(SourceFile:57) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_60]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_60]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SystemUtils.java:19) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:676) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:335) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:632) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:540) [craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_60]
    Caused by: java.lang.NullPointerException
        at me.Mee8a.playermessage.DeathMessage.onDeath(DeathMessage.java:23) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_60]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_60]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_60]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_60]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:300) ~[craftbukkit-1.8.7.jar:git-Bukkit-7723b90]
        ... 26 more
    


    <Edit by OP: Changed Log to correct message>
     
    Last edited: Sep 15, 2015
  2. Offline

    DoggyCode™

    This isn't "some spammy error logs in my consol", this is a Stack Trace which is caused an exception thrown by your plugin.

    For further details on how to troubleshoot your own plugin, please refer to: How to read stack traces and troubleshoot your own plugin.

    Now, on line 33 in your class "TpMain" is where it's being thrown, and it's caused by java.lang.ArrayIndexOutOfBoundsException (read about it here)--
    Code:
    at me.bukkit.Mee8a.commands.TpMain.onCommand(TpMain.java:33) ~[?:?]
    I'd suggest you look into this.

    EDIT:
    and for that matter, you're showing us your wrong Class. Show us your "TpMain" class.
     
  3. Offline

    Mee8a

    Ik im actully showing the wrong error log.
     
  4. Offline

    Zombie_Striker

    Code:
    Caused by: java.lang.NullPointerException
        at me.Mee8a.playermessage.DeathMessage.onDeath(DeathMessage.java:23) ~[?:?]
    
    if(e.getEntity().getKiller() == null) {
    
    Most likely e.getEntitiy is null. Add a check for that.
     
  5. Offline

    Mee8a

    I did. It still throws the error...
     
  6. Offline

    DoggyCode™

    It's because your plugin tries to send a message where it tries to find the %name%, but that can't be find because the entity being killed isn't a player.

    (so it would kind of go like for example if an non-player entity is being killed:
    Broadcast: "%killer% murdered %name%ERROR ERROR ERROR CANT FIND THE %name%)

    So add a statement to check that both the killer and event.getEntity() instanceof Player. Then go on
     
  7. Offline

    Mee8a

    Like this?
    Code:
    package me.Mee8a.playermessage;
    
    import org.bukkit.Bukkit;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    
    public class DeathMessage implements Listener{
       
        Core pl;
       
        public DeathMessage(Core instance) {
            pl = instance;
        }
       
        @EventHandler
        public void onDeath(PlayerDeathEvent e) {
            String death_message = pl.getConfig().getString("DEATH_MESSAGE");
            e.setDeathMessage(null);
           
            Player p = e.getEntity();
            if(!(e.getEntity().getKiller() instanceof Player) || !(e.getEntity() instanceof Player)) {
                return;
            }else{
                death_message = death_message.replaceAll("%killer%", p.getKiller().getName());
                death_message = death_message.replaceAll("%name%", p.getName());
               
                Bukkit.broadcastMessage(death_message);
            }
        }
    
    }
    
     
  8. Offline

    DoggyCode™

    @Mee8a Do it like this:
    Code:
    package me.Mee8a.playermessage;
    
    import org.bukkit.Bukkit;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    
    public class DeathMessage implements Listener{
      
        Core pl;
      
        public DeathMessage(Core instance) {
            pl = instance;
        }
      
        @EventHandler
        public void onDeath(PlayerDeathEvent e) {
            String death_message = pl.getConfig().getString("DEATH_MESSAGE");
            e.setDeathMessage(null);
          
            Player p = e.getEntity();
            if(!(e.getEntity().getKiller() instanceof Player && e.getEntity() instanceof Player))
                if(e.getEntity().getKiller() instanceof Player && e.getEntity() instanceof Player)
                death_message = death_message.replaceAll("%killer%", p.getKiller().getName());
                death_message = death_message.replaceAll("%name%", p.getName());
              
                Bukkit.broadcastMessage(death_message);
            }
        }
    }
    You used "||" which in Java means "or", which would mean if the player being killed is instance of a player or if the killer is instance of a player the code would still be ran, which would cause error. I replaced your "||" with "&&" which in Java means "and"-- so if the entity being killed is instance of a player AND the killer entity is instance of a Player then the code will be ran, where the plugin will find both the %name% and %killer% Strings from the Players.

    If you notice, I also organized your code a bit.
     
Thread Status:
Not open for further replies.

Share This Page