MySQL Abfrage ergibt NullPointerException

  • Java

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von GermanElectronix.

    MySQL Abfrage ergibt NullPointerException

    Hallo,

    ich habe mir eine kleine MySQL Klasse geschrieben. Allesfunktioniert wunderbar, bis auf das abfragen von Daten.

    Die MySQL-Klasse:

    Java-Quellcode

    1. package de.germanelectronix.coins.sql;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.PreparedStatement;
    5. import java.sql.ResultSet;
    6. import java.sql.SQLException;
    7. import org.bukkit.entity.Player;
    8. import de.germanelectronix.coins.Main;
    9. public class SQL {
    10. private static Connection con;
    11. public static void closeConnection() {
    12. try {
    13. if (con != null && !con.isClosed()) {
    14. con.close();
    15. }
    16. } catch (SQLException e) {
    17. e.printStackTrace();
    18. }
    19. }
    20. public synchronized static void openConnection() {
    21. try {
    22. con = DriverManager.getConnection("jdbc:mysql://"
    23. + Main.sql_host
    24. + ":"
    25. + Main.sql_port
    26. + "/"
    27. + Main.sql_db
    28. + "?user="
    29. + Main.sql_user
    30. + "&password="
    31. + Main.sql_pass
    32. + "&autoReconnect=true");
    33. con.createStatement().execute("CREATE TABLE IF NOT EXISTS coins_user (uuid TEXT,coins INT)");
    34. System.out.println("[Coins] Successfully connected to MySQL Database!");
    35. } catch (Exception e) {
    36. e.printStackTrace();
    37. }
    38. }
    39. public synchronized static void close() {
    40. try {
    41. con.close();
    42. } catch (Exception e) {
    43. e.printStackTrace();
    44. }
    45. }
    46. public synchronized static boolean containsPlayer(Player p) {
    47. try {
    48. PreparedStatement sql = con.prepareStatement("SELECT * FROM coins_user WHERE uuid=?;");
    49. sql.setString(1, p.getUniqueId().toString());
    50. ResultSet rs = sql.executeQuery();
    51. boolean contains = rs.next();
    52. sql.close();
    53. rs.close();
    54. return contains;
    55. } catch (Exception e) {
    56. e.printStackTrace();
    57. return false;
    58. }
    59. }
    60. // ----- CUSTOM METHODS ----- \\
    61. public static void createAccount(Player p) {
    62. openConnection();
    63. try {
    64. if(containsPlayer(p) == false){
    65. PreparedStatement newPlayer = con.prepareStatement("INSERT INTO coins_user values(?,0);");
    66. newPlayer.setString(1, p.getUniqueId().toString());
    67. newPlayer.execute();
    68. newPlayer.close();
    69. }
    70. } catch (Exception e) {
    71. e.printStackTrace();
    72. } finally {
    73. close();
    74. }
    75. }
    76. public static Integer getCoins(Player p){
    77. if(containsPlayer(p) == true){
    78. Integer coins = 0;
    79. try {
    80. PreparedStatement sql = con.prepareStatement("SELECT coins FROM coins_user WHERE uuid=?;");
    81. sql.setString(1, p.getUniqueId().toString());
    82. ResultSet result = sql.executeQuery();
    83. result.next();
    84. coins = result.getInt("coins");
    85. sql.close();
    86. result.close();
    87. return coins;
    88. } catch (SQLException e) {
    89. e.printStackTrace();
    90. return 0;
    91. }
    92. }
    93. return null;
    94. }
    95. }




    Das Problem besteht nun darin, dass ich immer eine NullPointerException ausgeworfen bekomme. Stimmt etwas am SQL Code nicht?

    Wie immer vielen Dank im Voraus für eure Hilfe! :)
    GermanElectronix

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „GermanElectronix“ ()

    Hi GermanElectronix,
    also ich hab da mal zu deinem Post ein paar Fragen, ohne die ich dir nicht antworten kann:

    1.) In welcher Zeile fliegt die Exception?

    2.) Was ist der genaue Text der Exception

    3.) Wo weist du rs in deiner Query Funktion zu?

    Lg Radinator

    PS: Eigentlich reicht Frage 3 :D
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Habe die SQL Klasse inzwischen noch einmal neu geschrieben. Allerdings bekomme ich immer noch eine NullPointerException:
    ​[15:35:13] [Server thread/INFO]: introlous issued server command: /coins[15:35:13] [Server thread/WARN]: java.lang.NullPointerException[15:35:13] [Server thread/WARN]: at de.germanelectronix.coins.sql.SQL.containsPlayer(SQL.java:58)[15:35:13] [Server thread/WARN]: at de.germanelectronix.coins.sql.SQL.getCoins(SQL.java:97)[15:35:13] [Server thread/WARN]: at de.germanelectronix.coins.cmd.GetCoins.onCommand(GetCoins.java:20)[15:35:13] [Server thread/WARN]: at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)[15:35:13] [Server thread/WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:180)[15:35:13] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_7_R3.CraftServer.dispatchCommand(CraftServer.java:701)[15:35:13] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.PlayerConnection.handleCommand(PlayerConnection.java:956)[15:35:13] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.PlayerConnection.a(PlayerConnection.java:817)[15:35:13] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.PacketPlayInChat.a(PacketPlayInChat.java:28)[15:35:13] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.PacketPlayInChat.handle(PacketPlayInChat.java:47)[15:35:13] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.NetworkManager.a(NetworkManager.java:157)[15:35:13] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.ServerConnection.c(SourceFile:134)[15:35:13] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.MinecraftServer.v(MinecraftServer.java:667)[15:35:13] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.DedicatedServer.v(DedicatedServer.java:260)[15:35:13] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.MinecraftServer.u(MinecraftServer.java:558)[15:35:13] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.MinecraftServer.run(MinecraftServer.java:469)[15:35:13] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.ThreadServerApplication.run(SourceFile:628)
    Also so wie ich das lese failt es an containsPlayer() und an getCoins().

    Mein erster Post bezog sich mit meiner Frage auf die getCoins Methode, da hast du zwar das Query ausgeführt, hast aber nichts dem ResultSet zugewiesen, nur am Annfang, als du rs = null gesetzt hast. Und wenn du es weiter im Code nicht änderst bleibt es auf null...

    Meine Frage: Hast du an das gedacht, den Code entsprechend geändern und es hat geklappt? Worauf hin du dann dir gedacht hast, da es jetzt funzt, schreib ich in noch mal von neu, oder hast du dir gedacht "Der geht eh nicht, also schreib ich ihn von neu!"?

    Bzw zu deinem Exception-Text: Der Debugger zeigt dir die Fehler in chronologischer Reihenfolge an, d.h. da wo es als aller erstes Hakt, das kommt auch als allererstes dran. Da ja in deinem Text die containsPlayer() Methode als erste aufgelistet wird, gehe ich davon aus dass es auch an der liegt.

    Meine spontan erste Vermutung wäre, dass du die openConnection() vorher aufrufst und zwar die Verbindung aufmachst, nur "gilt" die offene Verbindung eben nur für diese einen Methode LOKAL und nicht global...aber mit 100%iger Sicherheit kann ich es dir auch ned sagen, da kenn ich mich zu wenig mit Java aus. Ich hab das zwar ma in der Schule gelernt, mir dann ein 1300 Seiten Buch gekauft, dann 1 Jahr Java gesuchtelt, aber seither eigentlich nicht mehr angefasst. Bin jetzt seit gut 3 Jahren VB-Fan, klär aber hin und wieder gerne Java Fragen :D

    Hier findest du was zu NullPointerException. Hier wird auch erklärt, was das ist und wie die zustande kommt
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Radinator“ ()

    Vielen Dank für eure Antworten, aber ich habe den Fehler selbst gefunden. Ich habe die Connection in der ​createAccount(); Methode wieder geclosed. Diese wird immer im PlayerJoinEvent aufgerufen. Somit kann das ganze nicht klappen, da gar keine Connection mehr vorhanden ist.