Null Pointer Exception

Discussion in 'Spigot Plugin Development' started by minecrft, May 15, 2016.

  1. Hey all!

    I'm working on a combat log plugin, and I am getting null pointer exceptions and i'm not sure why? It just keeps spamming this in the console

    Full Error -
    Code (Text):
    [08:58:33 WARN]: [SKLog] Task #59168 for SKLog v0.01 generated an exception
    java.lang.NullPointerException
            at me.minecrft.SKLog$1.run(SKLog.java:197) ~[?:?]
            at org.bukkit.craftbukkit.v1_9_R2.scheduler.CraftTask.run(CraftTask.java:71) ~[spigot-1.9.4.jar:git-Spigot-4af49dc-c5e9a16]
            at org.bukkit.craftbukkit.v1_9_R2.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350) [spigot-1.9.4.jar:git-Spigot-4af49dc-c5e9a16]
            at net.minecraft.server.v1_9_R2.MinecraftServer.D(MinecraftServer.java:734) [spigot-1.9.4.jar:git-Spigot-4af49dc-c5e9a16]
            at net.minecraft.server.v1_9_R2.DedicatedServer.D(DedicatedServer.java:399) [spigot-1.9.4.jar:git-Spigot-4af49dc-c5e9a16]
            at net.minecraft.server.v1_9_R2.MinecraftServer.C(MinecraftServer.java:665) [spigot-1.9.4.jar:git-Spigot-4af49dc-c5e9a16]
            at net.minecraft.server.v1_9_R2.MinecraftServer.run(MinecraftServer.java:564) [spigot-1.9.4.jar:git-Spigot-4af49dc-c5e9a16]
            at java.lang.Thread.run(Thread.java:745) [?:1.8.0_72]
    [08:58:33 WARN]: [SKLog] Task #59241 for SKLog v0.01 generated an exception
    java.lang.NullPointerException
            at me.minecrft.SKLog$2.run(SKLog.java:219) ~[?:?]
            at org.bukkit.craftbukkit.v1_9_R2.scheduler.CraftTask.run(CraftTask.java:71) ~[spigot-1.9.4.jar:git-Spigot-4af49dc-c5e9a16]
            at org.bukkit.craftbukkit.v1_9_R2.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350) [spigot-1.9.4.jar:git-Spigot-4af49dc-c5e9a16]
            at net.minecraft.server.v1_9_R2.MinecraftServer.D(MinecraftServer.java:734) [spigot-1.9.4.jar:git-Spigot-4af49dc-c5e9a16]
            at net.minecraft.server.v1_9_R2.DedicatedServer.D(DedicatedServer.java:399) [spigot-1.9.4.jar:git-Spigot-4af49dc-c5e9a16]
            at net.minecraft.server.v1_9_R2.MinecraftServer.C(MinecraftServer.java:665) [spigot-1.9.4.jar:git-Spigot-4af49dc-c5e9a16]
            at net.minecraft.server.v1_9_R2.MinecraftServer.run(MinecraftServer.java:564) [spigot-1.9.4.jar:git-Spigot-4af49dc-c5e9a16]
            at java.lang.Thread.run(Thread.java:745) [?:1.8.0_72]
    Full Code -
    Code (Text):
    package me.minecrft;

    import java.util.ArrayList;
    import java.util.HashMap;

    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Entity;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.EntityDamageByEntityEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.event.player.PlayerQuitEvent;
    import org.bukkit.permissions.Permission;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.scheduler.BukkitRunnable;

    public class SKLog extends JavaPlugin implements Listener {

        Permission dis = new Permission("sl.disable");
        Permission en = new Permission("sl.enable");

        public void onEnable() {
            saveDefaultConfig();
            getServer().getPluginManager().registerEvents(this, this);
            getServer().getPluginManager().addPermission(dis);
            getServer().getPluginManager().addPermission(en);
        }

        ArrayList<String> inCombat = new ArrayList<String>();
        ArrayList<String> cLog = new ArrayList<String>();
        ArrayList<Player> off = new ArrayList<Player>();
        private HashMap<Player, Integer> cooldown = new HashMap<Player, Integer>();
        private HashMap<Player, BukkitRunnable> cooldownTask = new HashMap<Player, BukkitRunnable>();

        public void onDisable() {
            saveDefaultConfig();
        }

        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if (label.equalsIgnoreCase("sl")) {
                if (!(sender instanceof Player))
                    return false;
                Player p = (Player) sender;
                if (args.length == 1) {
                    if ((args[0].equalsIgnoreCase("time") || (args[0].equalsIgnoreCase("t")))) {
                        if (cooldown.containsKey(p) && (cooldownTask.containsKey(p))) {
                            String m = getConfig().getString("messages.timeleft").replace("{time}",
                                    cooldown.get(p).toString());
                            m = ChatColor.translateAlternateColorCodes('&', m);
                            p.sendMessage(m);
                        } else {
                            String m = getConfig().getString("messages.notincombat");
                            m = ChatColor.translateAlternateColorCodes('&', m);
                            p.sendMessage(m);
                        }
                    } else if ((args[0].equalsIgnoreCase("off"))) {
                        if (p.hasPermission(dis)) {
                            off.add(p);
                            String m = getConfig().getString("messages.sloff");
                            m = ChatColor.translateAlternateColorCodes('&', m);
                            p.sendMessage(m);
                            if (cooldown.containsKey(p) && cooldownTask.containsKey(p)) {
                                cooldown.remove(p);
                                cooldownTask.remove(p);
                            }
                        } else {
                            String m = getConfig().getString("messages.nopermission");
                            m = ChatColor.translateAlternateColorCodes('&', m);
                            p.sendMessage(m);
                        }
                    } else if ((args[0].equalsIgnoreCase("on"))) {
                        if (p.hasPermission(en)) {
                            off.remove(p);
                            String m = getConfig().getString("messages.slon");
                            m = ChatColor.translateAlternateColorCodes('&', m);
                            p.sendMessage(m);
                        } else {
                            String m = getConfig().getString("messages.nopermission");
                            m = ChatColor.translateAlternateColorCodes('&', m);
                            p.sendMessage(m);
                        }
                    } else if (args[0].equalsIgnoreCase("reload")) {
                        if (p.hasPermission(en)) {
                            reloadConfig();
                            String m = getConfig().getString("messages.reload");
                            m = ChatColor.translateAlternateColorCodes('&', m);
                            p.sendMessage(m);
                        } else {
                            String m = getConfig().getString("messages.nopermission");
                            m = ChatColor.translateAlternateColorCodes('&', m);
                            p.sendMessage(m);
                        }
                    }
                } else if (args.length == 2) {
                    if (args[0].equalsIgnoreCase("off")) {
                        if (p.hasPermission(dis)) {
                            boolean worked = false;
                            for (Player p1 : Bukkit.getOnlinePlayers()) {
                                if (p1.getName() == args[1]) {
                                    worked = true;
                                    off.add(p1);
                                    String m = getConfig().getString("messages.sloffyours").replace("{player}",
                                            p.getName());
                                    m = ChatColor.translateAlternateColorCodes('&', m);
                                    p1.sendMessage(m);
                                    String n = getConfig().getString("messages.sloffothers").replace("{player}",
                                            p1.getName());
                                    n = ChatColor.translateAlternateColorCodes('&', n);
                                    p.sendMessage(n);
                                }
                            }
                            if (worked = false) {
                                String m = getConfig().getString("messages.unknown").replace("{var}", args[1]);
                                m = ChatColor.translateAlternateColorCodes('&', m);
                                p.sendMessage(m);
                            }
                        } else {
                            String m = getConfig().getString("messages.nopermission");
                            m = ChatColor.translateAlternateColorCodes('&', m);
                            p.sendMessage(m);
                        }
                    } else if (args[0].equalsIgnoreCase("on")) {
                        if (p.hasPermission(en)) {
                            boolean worked = false;
                            for (Player p1 : Bukkit.getOnlinePlayers()) {
                                if (p1.getName() == args[1]) {
                                    worked = true;
                                    off.remove(p1);
                                    String m = getConfig().getString("messages.slonyours").replace("{player}", p.getName());
                                    m = ChatColor.translateAlternateColorCodes('&', m);
                                    p1.sendMessage(m);
                                    String n = getConfig().getString("messages.slonothers").replace("{player}",
                                            p1.getName());
                                    n = ChatColor.translateAlternateColorCodes('&', n);
                                    p.sendMessage(n);
                                }
                            }
                            if (worked = false) {
                                String m = getConfig().getString("messages.unknown").replace("{var}", args[1]);
                                m = ChatColor.translateAlternateColorCodes('&', m);
                                p.sendMessage(m);
                            }
                        } else {
                            String m = getConfig().getString("messages.nopermission");
                            m = ChatColor.translateAlternateColorCodes('&', m);
                            p.sendMessage(m);
                        }

                    }
                }
            }

            return true;
        }

        @EventHandler
        public void onJoin(PlayerJoinEvent e) {
            Player p = e.getPlayer();
            if (cLog.contains(p.getName())) {
                p.setHealth(0.0);
                cLog.remove(p.getName());
            }
        }

        @EventHandler
        public void onQuit(PlayerQuitEvent e) {
            Player p = e.getPlayer();
            if (cooldown.containsKey(p)) {
                String m = getConfig().getString("messages.combatlog").replace("{player}", p.getName());
                m = ChatColor.translateAlternateColorCodes('&', m);
                Bukkit.broadcastMessage(m);
                cLog.add(p.getName());
            }
        }

        @EventHandler
        public void onHit(EntityDamageByEntityEvent e) {
            Entity d = e.getDamager();
            Entity h = e.getEntity();
            if ((d instanceof Player) && (h instanceof Player)) {
                for (Player p : Bukkit.getOnlinePlayers()) {
                    if (!(off.contains(p))) {
                         if (p == d) {
                             if (!(cooldown.containsKey(p))) {
                                    String m = getConfig().getString("messages.combattag");
                                    m = ChatColor.translateAlternateColorCodes('&', m);
                                    p.sendMessage(m);
                                }
                            cooldown.put(p, Integer.parseInt(getConfig().getString("cooldownt")));
                            cooldownTask.put(p, new BukkitRunnable() {
                                public void run() {
                                    cooldown.put(p, cooldown.get(p) - 1);
                                    if (cooldown.get(p) == 0) {
                                        String m2 = getConfig().getString("messages.combattagover");
                                        m2 = ChatColor.translateAlternateColorCodes('&', m2);
                                        p.sendMessage(m2);
                                        cooldown.remove(p);
                                        cooldownTask.remove(p);
                                    }
                                }
                            });

                            cooldownTask.get(p).runTaskTimer(this, 0, 20);
                        } else if (p == h) {
                            if (!(cooldown.containsKey(p))) {
                                String m = getConfig().getString("messages.combattag");
                                m = ChatColor.translateAlternateColorCodes('&', m);
                                p.sendMessage(m);
                            }
                            cooldown.put(p, Integer.parseInt(getConfig().getString("cooldownt")));
                            cooldownTask.put(p, new BukkitRunnable() {

                                public void run() {
                                    cooldown.put(p, cooldown.get(p) - 1);
                                    if (cooldown.get(p) == 0) {
                                        String m2 = getConfig().getString("messages.combattagover");
                                        m2 = ChatColor.translateAlternateColorCodes('&', m2);
                                        p.sendMessage(m2);
                                        cooldown.remove(p);
                                        cooldownTask.remove(p);
                                    }
                                }

                            });

                            cooldownTask.get(p).runTaskTimer(this, 20, 20);
                        }
                    }

                }
            }
        }

    }
    Line 197 -
    Code (Text):
    cooldown.put(p, cooldown.get(p) - 1);
    Line 219
    Code (Text):
    cooldown.put(p, cooldown.get(p) - 1);
    Any Help?
     
  2. Are you sure the cooldown HashMap actually contains the "p" key ?
     
  3. Don't bump within 24 hours.

    Only thing that may happen is that cooldown doesn't contain p or p is null.
    cooldown itself can also be null.
     
  4. @benjozork i'm pretty sure it does, because right above it i said
    Code (Text):
    cooldown.put(p, Integer.parseInt(getConfig().getString("cooldownt")));
     
  5. Not recommended to use BukkitRunnables for cooldown systems, as Minecraft doesn't always guarentee you 20 ticks per second, they can be inconsistent, they won't work after reload, etc. Instead, put them into a Map with the current time + the amount of time in milliseconds you want to add them on cooldown for. Then, compare the system time to the time in the Map, and if it's greater than or equal to that, then remove them from the Map, and their cooldown will be over.

    A great tutorial about this can be found here.