Hashmap always return null?

Discussion in 'Plugin Development' started by beanonaboard, Apr 10, 2014.

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

    beanonaboard

    I have been adding the players but then it cannot find them once they are added and just returns null, if anyone knows please let me know Thank you!?

    First function adds them to the hashmap
    Code:java
    1. public void newSetScoreboard(Player p) {
    2.  
    3. objective.setDisplaySlot(DisplaySlot.SIDEBAR);
    4. objective.setDisplayName(ChatColor.DARK_AQUA + " Build Server ");
    5. if (p.isOnline()) {
    6. p.setScoreboard(board);
    7. Score score = objective.getScore(Bukkit.getOfflinePlayer(ChatColor.GREEN + "Build Level:"));
    8. try {
    9. int pScore = main.mysql.getPlayerScore(p);
    10. if(pScore != 0) {
    11. score.setScore(main.mysql.getPlayerScore(p));
    12. PlayerScores.put(p.getDisplayName().toLowerCase(), pScore);
    13. } else {
    14. score.setScore(1);
    15. PlayerScores.put(p.getDisplayName().toLowerCase(), 0);
    16. }
    17. } catch (IllegalStateException e) {
    18. System.out.println("[Leveling] Error getting player from database! " + e);
    19. } catch (SQLException e) {
    20. System.out.println("[Leveling] Error getting player from database! " + e);
    21. }
    22. }
    23. }


    Second function

    Code:java
    1. public void levelUP(Player p) {
    2. int current = PlayerScores.get(p.getDisplayName().toLowerCase());
    3. p.sendMessage(ChatColor.GREEN + "You now have " + current);
    4. }
     
  2. beanonaboard We'd need to see the whole code. Also, why are you storing the display name and not the name? And why are you converting it to lowercase?
     
  3. Offline

    Zethariel

    What returns null? Stack trace + full code of where it is supposed to return null plz
     
  4. Offline

    beanonaboard

    @AdamQpzm

    Rocoty

    Here is the stacktrace, main class and the LevelingSystem class

    Code:
    [13:57:50 WARN]: [Leveling] Task #20 for Leveling v0.1 generated an exception
    java.lang.NullPointerException
            at me.beanonaboard.Leveling.LevelingSystem.levelUP(LevelingSystem.java:9
    5) ~[?:?]
            at me.beanonaboard.Leveling.LevelingSystem$1.run(LevelingSystem.java:85)
    ~[?:?]
            at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftTask.run(CraftTask.java
    :53) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
            at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftScheduler.mainThreadHea
    rtbeat(CraftScheduler.java:345) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks
    ]
            at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:5
    87) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
            at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:2
    50) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
            at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:5
    45) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
            at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java
    :457) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
            at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:6
    17) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]

    Code:java
    1. package me.beanonaboard.Leveling;
    2.  
    3. import java.sql.SQLException;
    4. import java.util.ArrayList;
    5. import java.util.HashMap;
    6.  
    7. import org.bukkit.Bukkit;
    8. import org.bukkit.ChatColor;
    9. import org.bukkit.entity.Player;
    10. import org.bukkit.plugin.Plugin;
    11. import org.bukkit.scoreboard.DisplaySlot;
    12. import org.bukkit.scoreboard.Objective;
    13. import org.bukkit.scoreboard.Score;
    14. import org.bukkit.scoreboard.Scoreboard;
    15. import org.bukkit.scoreboard.ScoreboardManager;
    16.  
    17. public class LevelingSystem {
    18.  
    19. private final Main main;
    20.  
    21. public LevelingSystem(Main m) {
    22. this.main = m;
    23. }
    24. Plugin Levelingplugin = Bukkit.getPluginManager().getPlugin("Leveling");
    25.  
    26. public ArrayList<Integer> levelingSystem = new ArrayList<Integer>();
    27. public HashMap<String, Integer> PlayerScores = new HashMap<String, Integer>();
    28. ScoreboardManager manager = Bukkit.getScoreboardManager();
    29. Scoreboard board = manager.getNewScoreboard();
    30. Objective objective = board.registerNewObjective("test", "dummy");
    31.  
    32. public void levelSystem() {
    33. //Generate the level list
    34. levelingSystem.add(80);
    35. for(int i = 1; i < 100; i++) {
    36. double d = levelingSystem.get(i-1) * 1.1;
    37. int x = (int)d;
    38. levelingSystem.add(x);
    39. }
    40. }
    41.  
    42. public int setLevel(int i) {
    43. int level = 1;
    44. if(i >= levelingSystem.get(99)) {
    45. level = 99;
    46. } else {
    47. for (int k=1; k<levelingSystem.size(); k++)
    48. {
    49. if((i >= levelingSystem.get(k)) && (i <= levelingSystem.get(k + 1))) {
    50. level = k;
    51. }
    52. }
    53. }
    54. return level;
    55. }
    56.  
    57. public void newSetScoreboard(Player p) {
    58.  
    59. objective.setDisplaySlot(DisplaySlot.SIDEBAR);
    60. objective.setDisplayName(ChatColor.DARK_AQUA + " Build Server ");
    61. if (p.isOnline()) {
    62. p.setScoreboard(board);
    63. Score score = objective.getScore(Bukkit.getOfflinePlayer(ChatColor.GREEN + "Build Level:"));
    64. try {
    65. int pScore = main.mysql.getPlayerScore(p);
    66. if(pScore != 0) {
    67. score.setScore(main.mysql.getPlayerScore(p));
    68. PlayerScores.put(p.getDisplayName().toLowerCase(), pScore);
    69. } else {
    70. score.setScore(1);
    71. PlayerScores.put(p.getDisplayName().toLowerCase(), 0);
    72. }
    73. } catch (IllegalStateException e) {
    74. System.out.println("[Leveling] Error getting player from database! " + e);
    75. } catch (SQLException e) {
    76. System.out.println("[Leveling] Error getting player from database! " + e);
    77. }
    78. }
    79. }
    80.  
    81. public void xpEveryMinute() {
    82. Bukkit.getScheduler().scheduleSyncRepeatingTask(this.main, new Runnable() {
    83. public void run() {
    84. for (Player p : Bukkit.getServer().getOnlinePlayers()) {
    85. main.lSystem.levelUP(p, 8);
    86. }
    87.  
    88. }
    89. }, 300, 300); //1200,1200
    90. }
    91.  
    92. public void levelUP(Player p, int i) {
    93. int current = PlayerScores.get(p.getDisplayName().toLowerCase());
    94. int difference = main.lSystem.setLevel(current + i) - main.lSystem.setLevel(current);
    95. PlayerScores.put(p.getDisplayName().toLowerCase(), current + 8);
    96. if(difference != 0 && p.getScoreboard().getObjective("test") != null) {
    97. p.sendMessage(ChatColor.GREEN + "You have leveled up you are now Build Level " + main.lSystem.setLevel(current + i) + "!");
    98. Score score = objective.getScore(Bukkit.getOfflinePlayer(ChatColor.GREEN + "Build Level:"));
    99. score.setScore(main.lSystem.setLevel(PlayerScores.get(current)));
    100.  
    101. }
    102. }
    103.  
    104. public void existingSetScoreboard(Player p) {
    105. ScoreboardManager manager = Bukkit.getScoreboardManager();
    106. Scoreboard board = manager.getNewScoreboard();
    107. Objective objective = board.registerNewObjective("test", "dummy");
    108. objective.setDisplaySlot(DisplaySlot.SIDEBAR);
    109. objective.setDisplayName(ChatColor.DARK_AQUA + " Build Server ");
    110. if (p.isOnline()) {
    111. p.setScoreboard(board);
    112. Score score = objective.getScore(Bukkit.getOfflinePlayer(ChatColor.GREEN + "Build Level:"));
    113. score.setScore(main.lSystem.setLevel(PlayerScores.get(p.getDisplayName().toLowerCase())));
    114. }
    115. }
    116. }
    117.  


    main class
    Code:java
    1. package me.beanonaboard.Leveling;
    2.  
    3.  
    4. import java.sql.Connection;
    5. import java.sql.SQLException;
    6. import java.util.logging.Level;
    7.  
    8. import org.bukkit.Bukkit;
    9. import org.bukkit.event.Listener;
    10. import org.bukkit.plugin.Plugin;
    11. import org.bukkit.plugin.java.JavaPlugin;
    12.  
    13.  
    14. public class Main extends JavaPlugin {
    15.  
    16. private static Plugin plugin;
    17. public static Main instance;
    18. Connection c = null;
    19. public MySQLManager mysql = new MySQLManager(this);
    20. public LevelingSystem lSystem = new LevelingSystem(this);
    21.  
    22. public void onEnable() {
    23. plugin = this;
    24. getConfig().options().copyDefaults(true);
    25. saveDefaultConfig();
    26. Main.instance = this;
    27. registerEvents(this, new playerJoinEvent());
    28. lSystem.levelSystem();
    29. lSystem.xpEveryMinute();
    30.  
    31. try {
    32. this.mysql.setupDB();
    33. } catch (SQLException ex) {
    34. System.out.println("[Leveling] Error could not connect to database! " + Level.WARNING);
    35. System.out.println(ex);
    36. this.mysql.logDB = false;
    37. }
    38. }
    39.  
    40. public void onDisable() {
    41.  
    42. plugin = null;//To stop memory leaks
    43. this.mysql.closDB();
    44. }
    45.  
    46. public static void registerEvents(org.bukkit.plugin.Plugin plugin, Listener... listeners) {
    47. for (Listener listener : listeners) {
    48. Bukkit.getServer().getPluginManager().registerEvents(listener, plugin);
    49. }
    50. }
    51.  
    52. //Setup Database
    53.  
    54.  
    55.  
    56.  
    57. public static Plugin getPlugin() {
    58. return plugin;
    59. }
    60.  
    61.  
    62. }
    63.  
    64.  
     
  5. Offline

    Rocoty

    beanonaboard That's not nearly enough code. Is this in the main class or a separate class? In either case, can you post the full class (+ main class)?

    EDIT: Please don't edit your post after I have replied to it. It makes mine seem nonsensical.
     
  6. Offline

    beanonaboard

    sorry I didn't want to paste loads of code, I wont next time
     
  7. Offline

    Rocoty

    We would also need the code where you call the two methods
     
  8. Offline

    beanonaboard


    Here is the other class that they are referring too.

    Code:java
    1. package me.beanonaboard.Leveling;
    2.  
    3. import java.sql.ResultSet;
    4. import java.sql.SQLException;
    5. import java.sql.Statement;
    6.  
    7. import org.bukkit.entity.Player;
    8. import code.husky.mysql.MySQL;
    9.  
    10.  
    11. public class MySQLManager {
    12.  
    13. private final Main main;
    14. private MySQL db;
    15. public Boolean logDB = true;
    16.  
    17. public MySQLManager(Main m) {
    18. this.main = m;
    19. }
    20.  
    21. public void setupDB() throws SQLException {
    22. this.db = new MySQL(this.main, "localhost", "3306", "minecraft", "root", "xxxx");
    23. this.db.openConnection();
    24. Statement s = this.db.getConnection().createStatement();
    25. s.executeUpdate("CREATE TABLE IF NOT EXISTS PlayerStats (name VARCHAR(32), LevelXP INT)");
    26. }
    27.  
    28.  
    29. public void closDB() {
    30. this.db.closeConnection();
    31. }
    32.  
    33. public int getPlayerScore(Player p) throws SQLException {
    34. String pname = p.getDisplayName().toLowerCase();
    35. if(!this.db.checkConnection())
    36. this.db.openConnection();
    37. Statement statement = this.db.getConnection().createStatement();
    38. ResultSet rs = statement.executeQuery("SELECT * FROM PlayerStats WHERE 'Name' = '"+pname+"';");
    39. if(!rs.next()) return 0;
    40.  
    41. return rs.getInt("XP");
    42. }
    43.  
    44. public void updatePlayer(Player p) throws SQLException {
    45. String pname = p.getDisplayName().toLowerCase();
    46.  
    47. if(!this.db.checkConnection()) {
    48. this.db.openConnection();
    49. }
    50. Statement statement = this.db.getConnection().createStatement();
    51. int XP = main.lSystem.PlayerScores.get(p.getDisplayName().toLowerCase());
    52.  
    53. if(XP != 0) {
    54. if (this.getPlayerScore(p) != 0) {
    55. statement.executeUpdate("UPDATE playerStats SET LevelXP = '"+(XP)+"' WHERE 'Name' = '"+pname+"';");
    56. } else {
    57. statement.executeUpdate("INSERT INTO playerStats (`name`, `LevelXP`) VALUES ('" + pname + "', '0');");
    58. }
    59. }
    60. main.lSystem.PlayerScores.remove(p.getDisplayName().toLowerCase());
    61.  
    62. }
    63. }
    64.  
     
  9. Offline

    Rocoty

    But from where do you call levelUP and newSetScoreboard?
     
  10. Offline

    beanonaboard


    levelUp is called from xpEveryMinute in the LevelingSystem class (line 85) but the newSetScoreboard is called from this this class (sorry I should have put this up too.

    Code:java
    1. package me.beanonaboard.Leveling;
    2.  
    3. import java.sql.SQLException;
    4.  
    5. import org.bukkit.ChatColor;
    6. import org.bukkit.entity.Player;
    7. import org.bukkit.event.EventHandler;
    8. import org.bukkit.event.Listener;
    9. import org.bukkit.event.player.AsyncPlayerChatEvent;
    10. import org.bukkit.event.player.PlayerJoinEvent;
    11. import org.bukkit.event.player.PlayerQuitEvent;
    12.  
    13. public class playerJoinEvent implements Listener{
    14.  
    15.  
    16.  
    17. @EventHandler
    18. public void onPlayerJoinEvent(PlayerJoinEvent e) {
    19. Player p = e.getPlayer();
    20. Main.instance.lSystem.newSetScoreboard(p);
    21. }
    22.  
    23. @EventHandler
    24. public void onPlayerQuit(PlayerQuitEvent e) {
    25. Player p = e.getPlayer();
    26. try {
    27. Main.instance.mysql.updatePlayer(p);
    28. } catch (SQLException e1) {
    29. System.out.println("[Leveling] Database error, player quiting! " + e1);
    30. }
    31. }
    32. @EventHandler
    33. public void playerChatEvent(AsyncPlayerChatEvent e) {
    34. Player p = e.getPlayer();
    35. int xp = Main.instance.lSystem.PlayerScores.get(p.getName());
    36. int level = Main.instance.lSystem.setLevel(xp);
    37. e.setMessage(ChatColor.DARK_AQUA + "[Level " + level + "] " + ChatColor.RESET + e.getMessage());
    38. }
    39. }
    40.  
     
Thread Status:
Not open for further replies.

Share This Page