Null pointer exception

Discussion in 'Plugin Development' started by cfil360, Nov 17, 2013.

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

    1Rogue


    Can you provide your full class as it is right now?
     
  2. Offline

    cfil360

    1Rogue yes here you go for the third time.
    Code:java
    1. package me.connor.scoreboard;
    2.  
    3. import java.util.ArrayList;
    4. import java.util.HashMap;
    5.  
    6. import net.milkbowl.vault.economy.Economy;
    7. import net.milkbowl.vault.economy.EconomyResponse;
    8.  
    9. import org.bukkit.Bukkit;
    10. import org.bukkit.ChatColor;
    11. import org.bukkit.command.Command;
    12. import org.bukkit.command.CommandSender;
    13. import org.bukkit.entity.Player;
    14. import org.bukkit.event.EventHandler;
    15. import org.bukkit.event.Listener;
    16. import org.bukkit.event.entity.PlayerDeathEvent;
    17. import org.bukkit.event.player.PlayerJoinEvent;
    18. import org.bukkit.plugin.RegisteredServiceProvider;
    19. import org.bukkit.plugin.java.JavaPlugin;
    20. import org.bukkit.scoreboard.DisplaySlot;
    21. import org.bukkit.scoreboard.Objective;
    22. import org.bukkit.scoreboard.Score;
    23. import org.bukkit.scoreboard.Scoreboard;
    24. import org.bukkit.scoreboard.ScoreboardManager;
    25.  
    26.  
    27. public class KD extends JavaPlugin implements Listener {
    28. public HashMap<String, Scoreboard> UsedScoreboard = new HashMap<String, Scoreboard>();
    29. public HashMap<String, Integer> kills = new HashMap<String, Integer>();
    30. public HashMap<String, Integer> deaths = new HashMap<String, Integer>();
    31. public ArrayList<String> show = new ArrayList<String>();
    32. public Economy econ = null;
    33.  
    34.  
    35. public void onEnable() {
    36. Bukkit.getServer().getPluginManager().registerEvents(this, this);
    37. this.saveConfig();
    38.  
    39. if (!setupEconomy()) {
    40. getLogger().severe(ChatColor.RED + "Economy disabled due to no Vault dependency found!");
    41. return;
    42. }
    43.  
    44. for(Player p : Bukkit.getServer().getOnlinePlayers()) {
    45. serverReload(p);
    46. }
    47. }
    48.  
    49. public void onDisable() {
    50. for(Player p : this.getServer().getOnlinePlayers()) {
    51. this.getConfig().set(p.getName() + ".kills", kills.get(p.getName()));
    52. this.getConfig().set(p.getName() + ".deaths", deaths.get(p.getName()));
    53. }
    54. this.saveConfig();
    55. }
    56.  
    57. private boolean setupEconomy() {
    58. if (getServer().getPluginManager().getPlugin("Vault") == null) {
    59. return false;
    60. }
    61. RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
    62. if (rsp == null) {
    63. return false;
    64. }
    65. econ = rsp.getProvider();
    66. return econ != null;
    67. }
    68.  
    69. public void serverReload(Player p) {
    70. //recreate hashmaps
    71.  
    72. getKills(p);
    73. getDeaths(p);
    74. setScoreboard(p);
    75. show.add(p.getName());
    76. }
    77.  
    78. public void setScoreboard(Player p) {
    79. ScoreboardManager manager = Bukkit.getScoreboardManager();
    80. Scoreboard board = manager.getNewScoreboard();
    81. //economy enabled from config
    82. boolean EconomyEnabled = this.getConfig().getBoolean("Economy.enabled");
    83.  
    84. Objective objective = board.registerNewObjective("score", "dummy");
    85. objective.setDisplayName(this.getConfig().getString("ScoreboardName"));
    86. objective.setDisplaySlot(DisplaySlot.SIDEBAR);
    87.  
    88. Score killsScore = objective.getScore(Bukkit.getOfflinePlayer(ChatColor.BLUE + "Kills:")); //Get a fake offline player
    89. Score deathsScore = objective.getScore(Bukkit.getOfflinePlayer(ChatColor.RED + "Deaths:")); //Get a fake offline player
    90.  
    91. killsScore.setScore(kills.get(p.getName()));
    92. deathsScore.setScore(deaths.get(p.getName()));
    93.  
    94. if(EconomyEnabled == true) {
    95. try{
    96. Score moneyScore = objective.getScore(Bukkit.getOfflinePlayer(ChatColor.GREEN + "Balance:"));
    97. moneyScore.setScore((int) getMoney(p));
    98. } catch(Exception ex) {
    99. getLogger().severe("Economy disabled due to no Vault dependency found!");
    100. this.getConfig().set("Economy.enabled", false);
    101. setScoreboard(p);
    102. }
    103. }
    104.  
    105. p.setScoreboard(board);
    106. }
    107.  
    108. public void resetScoreboard(Player p) {
    109. ScoreboardManager manager = Bukkit.getScoreboardManager();
    110.  
    111. p.setScoreboard(manager.getNewScoreboard());
    112. }
    113.  
    114. public HashMap<String, Integer> getKills(Player p) {
    115. try {
    116. kills.put(p.getName(), this.getConfig().getInt(p.getName() + ".kills"));
    117. }
    118. catch (Exception ex) {
    119. kills.put(p.getName(), 0);
    120. this.getConfig().set(p.getName() + ".kills", kills.get(p.getName()));
    121. this.saveConfig();
    122. return kills;
    123. }
    124.  
    125. return kills;
    126. }
    127.  
    128. public HashMap<String, Integer> getDeaths(Player p) {
    129. try {
    130. deaths.put(p.getName(), this.getConfig().getInt(p.getName() + ".deaths"));
    131. }
    132. catch (Exception ex) {
    133. deaths.put(p.getName(), 0);
    134. this.getConfig().set(p.getName() + ".deaths", deaths.get(p.getName()));
    135. this.saveConfig();
    136. return deaths;
    137. }
    138.  
    139. return deaths;
    140. }
    141.  
    142. public double getMoney(Player p) {
    143. Double money = this.econ.getBalance(p.getName());
    144. return money;
    145. }
    146.  
    147. @EventHandler
    148. public void onJoin(PlayerJoinEvent e) {
    149. Player p = e.getPlayer();
    150. getKills(p);
    151. getDeaths(p);
    152. setScoreboard(p);
    153. show.add(p.getName());
    154. }
    155.  
    156. @EventHandler
    157. public void onPlayerDeath(PlayerDeathEvent e) {
    158. Player p = e.getEntity();
    159.  
    160. if(p.getKiller() instanceof Player){
    161. Player k = p.getKiller();
    162.  
    163. int currentKills = kills.get(k.getName());
    164. currentKills++;
    165.  
    166. kills.put(k.getName(), currentKills);
    167.  
    168. this.getConfig().set(k.getName() + ".kills", kills.get(k.getName()));
    169.  
    170. try {
    171. double reward = this.getConfig().getDouble("Economy.reward");
    172. EconomyResponse r = this.econ.depositPlayer(k.getName(), reward);
    173. if(r.transactionSuccess()) {
    174. k.sendMessage(ChatColor.AQUA + "You got $" + reward + " for killing " + p.getName());
    175. }
    176. } catch(Exception ex) {
    177.  
    178. } finally {
    179.  
    180. if(show.contains(k.getName())) {
    181. setScoreboard(k);
    182. }
    183. }
    184. }
    185.  
    186. int currentDeaths = deaths.get(p.getName());
    187. currentDeaths++;
    188.  
    189. deaths.put(p.getName(), currentDeaths);
    190.  
    191. setScoreboard(p);
    192.  
    193. this.getConfig().set(p.getName() + ".deaths", deaths.get(p.getName()));
    194. this.saveConfig();
    195. }
    196.  
    197. public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
    198. if(cmd.getName().equalsIgnoreCase("sb")) {
    199. if(!(sender instanceof Player)) {
    200. sender.sendMessage(ChatColor.RED + "Only players can use scoreboard!");
    201. return true;
    202. }
    203.  
    204. if(args.length == 0) {
    205. sender.sendMessage(ChatColor.RED + "Usage: /sb hide/show");
    206. return true;
    207. }
    208.  
    209. //define player
    210. Player p = (Player) sender;
    211.  
    212. if(args[0].equalsIgnoreCase("hide")) {
    213. show.remove(p.getName());
    214. resetScoreboard(p);
    215. return true;
    216. }
    217.  
    218. if(args[0].equalsIgnoreCase("show")) {
    219. show.add(p.getName());
    220. setScoreboard(p);
    221. return true;
    222. }
    223.  
    224. }
    225.  
    226.  
    227. return true;
    228. }
    229. }
    230.  


    Errors
    Code:
    Could not pass PlayerDeathEvent...
     
    Null Pointer Exception on line 188
    edit- sorry accidently posted old version. New one is here.
     
  3. Offline

    1Rogue

    Code:java
    1. public void serverReload(Player p) {
    2. //recreate hashmaps
    3. kills = new HashMap<String, Integer>();
    4. deaths = new HashMap<String, Integer>();
    5.  
    6. getKills(p);
    7. getDeaths(p);
    8. setScoreboard(p);
    9. show.add(p.getName());
    10. }


    Code:java
    1. kills = new HashMap<String, Integer>();
    2. deaths = new HashMap<String, Integer>();


    Here you go for the sixth time:
     
  4. Offline

    cfil360

    1Rogue still doesn't work and i changed the code that i posted i accidently posted old code.
     
  5. Offline

    1Rogue


    Alright then, can I have your current code?
     
  6. Offline

    cfil360

    1Rogue yes i edited the post it has the new code. BTW thanks for sticking through this with me.
     
  7. Offline

    1Rogue

    In your serverReload() method, verify the players in them:
    Code:java
    1. Integer death = deaths.get(p.getName());
    2. if (death == null) {
    3. deaths.put(p.getName(), 0);
    4. }


    Do the same for kills.
     
  8. Offline

    the_merciless

  9. Offline

    cfil360

  10. Offline

    1Rogue


    Then what is your current .serverReload() method as it is written right now?

    Edit: and your onEnable.
     
  11. Offline

    cfil360

    1Rogue
    onEnable
    Code:java
    1. public void onEnable() {
    2. Bukkit.getServer().getPluginManager().registerEvents(this, this);
    3. this.saveConfig();
    4.  
    5. if (!setupEconomy()) {
    6. getLogger().severe(ChatColor.RED + "Economy disabled due to no Vault dependency found!");
    7. return;
    8. }
    9.  
    10. for(Player p : Bukkit.getServer().getOnlinePlayers()) {
    11. serverReload(p);
    12. }
    13. }

    serverReload
    Code:java
    1. public void serverReload(Player p) {
    2. getKills(p);
    3. getDeaths(p);
    4.  
    5. if(kills.get(p.getName()) == null) {
    6. kills.put(p.getName(), 0);
    7. }
    8.  
    9. if(deaths.get(p.getName()) == null) {
    10. deaths.put(p.getName(), 0);
    11. }
    12.  
    13. setScoreboard(p);
    14. show.add(p.getName());
    15. }
     
  12. Offline

    1Rogue

    Your .getDeaths() and .getKills() method is a bit incorrect as well:

    Before:
    Show Spoiler
    Code:java
    1. public HashMap<String, Integer> getDeaths(Player p) {
    2. try {
    3. deaths.put(p.getName(), this.getConfig().getInt(p.getName() + ".deaths"));
    4. }
    5. catch (Exception ex) {
    6. deaths.put(p.getName(), 0);
    7. this.getConfig().set(p.getName() + ".deaths", deaths.get(p.getName()));
    8. this.saveConfig();
    9. return deaths;
    10. }
    11.  
    12. return deaths;
    13. }


    After:
    Code:java
    1. public int getDeaths(Player p) {
    2. Integer deaths = this.deaths.get(p.getName());
    3. if (deaths == null) {
    4. Integer newDeaths = this.getConfig().getInt(p.getName() + ".deaths");
    5. if (deaths == null || deaths == 0) {
    6. deaths.put(p.getName(), 0);
    7. this.getConfig().set(p.getName() + ".deaths", 0);
    8. this.saveConfig();
    9. return 0;
    10. } else {
    11. deaths.put(p.getName(), deaths);
    12. }
    13. return newDeaths;
    14. }
    15. return deaths;
    16. }


    Same idea for kills as well. From there, you can simply call:
    Code:java
    1. int deaths = getDeaths(p.getName());
     
  13. Offline

    the_merciless

    Use this code:

    Code:
    package me.connor.scoreboard;
     
    import java.util.ArrayList;
    import java.util.HashMap;
     
    import net.milkbowl.vault.economy.Economy;
    import net.milkbowl.vault.economy.EconomyResponse;
     
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.configuration.Configuration;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.PlayerDeathEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.event.player.PlayerKickEvent;
    import org.bukkit.event.player.PlayerQuitEvent;
    import org.bukkit.plugin.RegisteredServiceProvider;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.Objective;
    import org.bukkit.scoreboard.Score;
    import org.bukkit.scoreboard.Scoreboard;
    import org.bukkit.scoreboard.ScoreboardManager;
     
    public class KD extends JavaPlugin implements Listener {
       
        public HashMap<String, Scoreboard> UsedScoreboard = new HashMap<String, Scoreboard>();
        public HashMap<String, Integer> kills = new HashMap<String, Integer>();
        public HashMap<String, Integer> deaths = new HashMap<String, Integer>();
        public ArrayList<String> show = new ArrayList<String>();
        public Economy econ = null;
        Configuration config;
     
        ///////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
       
        public void onEnable() {
            Bukkit.getServer().getPluginManager().registerEvents(this, this);
            this.saveConfig();
            config = getConfig();
     
            if (!setupEconomy()) {
                getLogger().severe(ChatColor.RED + "Economy disabled due to no Vault dependency found!");
                return;
            }
     
            for (Player p : Bukkit.getOnlinePlayers()){
                loadPlayerStats(p);
                setScoreboard(p);
                show.add(p.getName());
            }
        }
       
        ///////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
     
        private void loadPlayerStats(Player p) {
            String pname = p.getName();
           
            if (config.contains(pname + ".kills")){
                kills.put(pname, config.getInt(pname + ".kills"));
            }
            if (config.contains(pname + ".deaths")){
                deaths.put(pname, config.getInt(pname + ".deaths"));
            }
           
        }
     
        //////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
       
        public void onDisable() {
            for (Player p : Bukkit.getOnlinePlayers()){
                savePlayerStats(p);
            }
        }
       
        ///////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
     
        private void savePlayerStats(Player p) {
            String pname = p.getName();
           
            if (kills.containsKey(pname)){
                config.set(pname + ".kills", getKills(p));
                saveConfig();
                kills.remove(pname);
            }
            if (deaths.containsKey(pname)){
                config.set(pname + ".deaths", getDeaths(p));
                saveConfig();
                deaths.remove(pname);
            }
        }
     
        /////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
       
        private boolean setupEconomy() {
            if (getServer().getPluginManager().getPlugin("Vault") == null) {
                return false;
            }
            RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
            if (rsp == null) {
                return false;
            }
            econ = rsp.getProvider();
            return econ != null;
        }
     
        /////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
       
        public void setScoreboard(Player p) {
            ScoreboardManager manager = Bukkit.getScoreboardManager();
            Scoreboard board = manager.getNewScoreboard();
            // economy enabled from config
            boolean EconomyEnabled = this.getConfig().getBoolean("Economy.enabled");
     
            Objective objective = board.registerNewObjective("score", "dummy");
            objective.setDisplayName(this.getConfig().getString("ScoreboardName"));
            objective.setDisplaySlot(DisplaySlot.SIDEBAR);
     
            Score killsScore = objective.getScore(Bukkit.getOfflinePlayer(ChatColor.BLUE + "Kills:")); // Get a fake offline player
            Score deathsScore = objective.getScore(Bukkit.getOfflinePlayer(ChatColor.RED + "Deaths:")); // Get a fake offline player
     
            killsScore.setScore(getKills(p));
            deathsScore.setScore(getDeaths(p));
     
            if (EconomyEnabled == true) {
                try {
                    Score moneyScore = objective.getScore(Bukkit.getOfflinePlayer(ChatColor.GREEN + "Balance:"));
                    moneyScore.setScore((int) getMoney(p));
                } catch (Exception ex) {
                    getLogger().severe("Economy disabled due to no Vault dependency found!");
                    this.getConfig().set("Economy.enabled", false);
                    setScoreboard(p);
                }
            }
     
            p.setScoreboard(board);
        }
       
        ///////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
     
        public void resetScoreboard(Player p) {
            ScoreboardManager manager = Bukkit.getScoreboardManager();
            p.setScoreboard(manager.getNewScoreboard());
        }
       
        /////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
     
        public int getDeaths(Player p) {
           
            if (deaths.containsKey(p.getName())){
                return deaths.get(p.getName());
            }else{
                return 0;
            }
           
        }
       
        /////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
     
        public int setDeaths(Player p, int amount) {
            deaths.put(p.getName(), amount);
        }
       
        /////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
     
        public int getKills(Player p) {
           
            if (kills.containsKey(p.getName())){
                return kills.get(p.getName());
            }else{
                return 0;
            }
           
        }
       
        /////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
     
        public int setKills(Player p, int amount) {
            kills.put(p.getName(), amount);
        }
       
        ////////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
     
        public double getMoney(Player p) {
            Double money = this.econ.getBalance(p.getName());
            return money;
        }
     
        ///////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
       
        @EventHandler
        public void onJoin(PlayerJoinEvent e) {
            Player p = e.getPlayer();
            loadPlayerStats(p);
            setScoreboard(p);
            show.add(p.getName());
        }
       
        ///////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
       
        @EventHandler
        public void onQuit(PlayerQuitEvent e) {
            Player p = e.getPlayer();
            savePlayerStats(p);
        }
       
        ///////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
       
        @EventHandler
        public void onKick(PlayerKickEvent e) {
            Player p = e.getPlayer();
            savePlayerStats(p);
        }
       
        ///////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
     
        @EventHandler
        public void onPlayerDeath(PlayerDeathEvent e) {
            Player p = e.getEntity();
     
            if (p.getKiller() instanceof Player) {
                Player k = p.getKiller();
     
                setKills(k, getKills(k) + 1);
     
                try {
                    double reward = this.getConfig().getDouble("Economy.reward");
                    EconomyResponse r = this.econ.depositPlayer(k.getName(), reward);
                    if (r.transactionSuccess()) {
                        k.sendMessage(ChatColor.AQUA + "You got $" + reward + " for killing " + p.getName());
                    }
                } catch (Exception ex) {
     
                } finally {
     
                    if (show.contains(k.getName())) {
                        setScoreboard(k);
                    }
                }
            }
     
            setDeaths(p, getDeaths(p));
     
            setScoreboard(p);
        }
       
        ///////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////
     
        public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
            if (cmd.getName().equalsIgnoreCase("sb")) {
                if (!(sender instanceof Player)) {
                    sender.sendMessage(ChatColor.RED + "Only players can use scoreboard!");
                    return true;
                }
     
                if (args.length == 0) {
                    sender.sendMessage(ChatColor.RED + "Usage: /sb hide/show");
                    return true;
                }
     
                // define player
                Player p = (Player) sender;
     
                if (args[0].equalsIgnoreCase("hide")) {
                    show.remove(p.getName());
                    resetScoreboard(p);
                    return true;
                }
     
                if (args[0].equalsIgnoreCase("show")) {
                    show.add(p.getName());
                    setScoreboard(p);
                    return true;
                }
     
            }
     
            return true;
        }
    }
     
  14. Offline

    cfil360

    the_merciless doesn't work just sets everything to 0

    1Rogue This doesn't work because you are trying to input into an Integer not a hashmap which isn't possible and im a little confused about it. It seems like it will prevent errors, but i don't think it will get the correct deathes of the player. Correct me if i'm wrong.
     
  15. Offline

    1Rogue

    It will get the deaths of the player from the hashmap. If hashmap has no entry / a null entry, then it will get it from the config. If the config's entry is null / non-existant, it will set it as 0 and return 0.

    I don't know what you mean by "putting into an integer, not a hashmap". If you mean the return value, it has nothing to do with the hashmap you use.
     
  16. Offline

    the_merciless

    There's no reason that my code should not work as intended. (As far as I can see) perhaps your death event is being cancelled by another plugin. Try setting the event priority higher

    @EventHandler(priority = EventPriority.HIGH)
    Public void onPlayerDeath.....

    (Ignore what's in the config during gameplay. It will only update the config when you log out or shut down the server)
     
  17. Offline

    cfil360

    the_merciless it kinda works except when the server is reloaded every time a player dies it is returning null so it always sets the kills and deaths to 0. I just wanna know why it is returning null when there is a valid value available.
     
  18. Offline

    the_merciless

    When you say its returning null do you mean your getting an npe? if so show us it.
     
  19. Offline

    cfil360

    the_merciless No it doesn't throw an NPE but it is returning null and when the code receives null it sets kills or deaths to 0.
     
Thread Status:
Not open for further replies.

Share This Page