2014-07-23 3 views
3

Я пытаюсь создать плагин Bukkit с поддержкой MySQL. Плагин, который я делаю, является плагином eco, поэтому я должен поместить все имена игроков в таблицу MySQL. Я использую PlayerJoinEvent для регистрации игрока в базе данных, если они еще не зарегистрированы. Когда я включаю свой плагин, он не дает никаких ошибок, но когда игрок присоединяется (при запуске PlayerJoinEvent) появляется ошибка.MySQL - Java - BukkitAPI - Ошибка при подключении к базе данных MySQL

[19:07:54 INFO]: UUID of player behhhans is da772a82-cdc9-3b79-962b-4cdc7623dd7a 

[19:07:54 ERROR]: Could not pass event PlayerLoginEvent to Tokeconomy v1.0 
org.bukkit.event.EventException 
     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja 
va:294) ~[spigot.jar:git-Spigot-1523] 
     at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav 
a:62) ~[spigot.jar:git-Spigot-1523] 
     at org.bukkit.plugin.TimedRegisteredListener.callEvent(TimedRegisteredLi 
stener.java:30) ~[spigot.jar:git-Spigot-1523] 
     at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j 
ava:502) [spigot.jar:git-Spigot-1523] 
     at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j 
ava:487) [spigot.jar:git-Spigot-1523] 
     at net.minecraft.server.v1_7_R3.PlayerList.attemptLogin(PlayerList.java: 
400) [spigot.jar:git-Spigot-1523] 
     at net.minecraft.server.v1_7_R3.LoginListener.c(LoginListener.java:97) [ 
spigot.jar:git-Spigot-1523] 
     at net.minecraft.server.v1_7_R3.LoginListener.a(LoginListener.java:43) [ 
spigot.jar:git-Spigot-1523] 
     at net.minecraft.server.v1_7_R3.NetworkManager.a(NetworkManager.java:187 
) [spigot.jar:git-Spigot-1523] 
     at net.minecraft.server.v1_7_R3.ServerConnection.c(ServerConnection.java 
:81) [spigot.jar:git-Spigot-1523] 
     at net.minecraft.server.v1_7_R3.MinecraftServer.v(MinecraftServer.java:7 
20) [spigot.jar:git-Spigot-1523] 
     at net.minecraft.server.v1_7_R3.DedicatedServer.v(DedicatedServer.java:2 
83) [spigot.jar:git-Spigot-1523] 
     at net.minecraft.server.v1_7_R3.MinecraftServer.u(MinecraftServer.java:5 
83) [spigot.jar:git-Spigot-1523] 
     at net.minecraft.server.v1_7_R3.MinecraftServer.run(MinecraftServer.java 
:489) [spigot.jar:git-Spigot-1523] 
     at net.minecraft.server.v1_7_R3.ThreadServerApplication.run(SourceFile:6 
28) [spigot.jar:git-Spigot-1523] 
Caused by: java.lang.NullPointerException 
     at me.bramhaag.Tokeconomy.MySQLHandler.createAccount(MySQLHandler.java:1 
02) ~[?:?] 
     at me.bramhaag.Tokeconomy.EventListener.onLogin(EventListener.java:27) ~ 
[?:?] 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0 
_65] 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0 
_65] 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1 
.7.0_65] 
     at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.7.0_65] 
     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja 
va:292) ~[spigot.jar:git-Spigot-1523] 
     ... 14 more 
[19:07:54 INFO]: behhhans[/127.0.0.1:57702] logged in with entity id 6067 at ([w 
orld] 710.6999999880791, 41.0, 309.4669731960532) 

класс MySQLHandler:

package me.bramhaag.Tokeconomy; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class MySQLHandler { 

    private Main plugin; 

    public MySQLHandler (Main plugin) 
    { 
     this.plugin = plugin; 
    } 


    Connection conn = null; 

    private String host, port, user, password, database; 

    public MySQLHandler(String host, String port, String database, String user, String password) { 
     this.host = host; this.port = port; this.user = user; this.password = password; this.database = database; 
    } 

    public void connect() { 
     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      conn = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database + "?user=" + user + "&password=" + password); 

      conn.createStatement().execute("CREATE TABLE IF NOT EXISTS `tokens` (`Name` varchar(32), `amount` int)"); 
     } catch (ClassNotFoundException e) { e.printStackTrace(); 
     } catch (SQLException e) { e.printStackTrace(); } 
    } 


    public void createAccount(String player) throws SQLException { 


      try (PreparedStatement pstat = conn.prepareStatement("SELECT 1 FROM tokens WHERE name=? LIMIT 1"))// Error line (Line 102)! 
      { 
       pstat.setString(1, player); 

       try (ResultSet rs = pstat.executeQuery()) 
       { 
        if (!rs.next()) 
        { 
         pstat.executeUpdate("UPDATE `tokens` (`Name`,`amount`) VALUE ('" + player + "', '" + 0 + "')"); 
        } 
       } 
      } 
    } 

    public void updateLast(String player) { 
     try { 
      conn.createStatement().execute("UPDATE `bsp` SET `lastlogin` = '"+ String.valueOf(System.currentTimeMillis()) +"'"); 
     } catch (SQLException e) { e.printStackTrace(); } 
    } 

    public int getTokens(String pname) throws SQLException { 

     ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM `tokens` WHERE `Name`='"+ pname + "';"); 
     if(!rs.next()) { 
      return 0; 
     } 
     return rs.getInt("amount"); 
    } 

    public void updatePlayerAdd(String pname, double amount) throws SQLException { 

     int tokens = this.getTokens(pname); 
     if(tokens!=0) { 
      conn.createStatement().executeUpdate("UPDATE `tokens` SET `amount`='"+ (tokens + amount)+"' WHERE `Name`='"+ pname + "';"); 
     } else { 
      conn.createStatement().executeUpdate("INSERT INTO `tokens` (`Name`, `amount`) VALUES('" + pname +",'1');"); 
     } 
    } 

    public void updatePlayerReject(String pname, double amount) throws SQLException { 

     int tokens = this.getTokens(pname); 
     if(tokens!=0) { 
      conn.createStatement().executeUpdate("UPDATE `tokens` SET `amount`='"+ (tokens - amount)+"' WHERE `Name`='"+ pname + "';"); 
     } else { 
      conn.createStatement().executeUpdate("INSRT INTO `tokens` (`Name`, `amount`) VALUES('" + pname +",'1');"); 
     } 
    } 

    public void updatePlayerSet(String pname, double amount) throws SQLException { 

     int tokens = this.getTokens(pname); 
     if(tokens!=0) { 
      conn.createStatement().executeUpdate("UPDATE `tokens` SET `amount`='"+ (amount)+"' WHERE `Name`='"+ pname + "';"); 
     } else { 
      conn.createStatement().executeUpdate("INSRT INTO `tokens` (`Name`, `amount`) VALUES('" + pname +",'1');"); 
     } 
    } 

} 

EventHandler класс:

package me.bramhaag.Tokeconomy; 

import java.sql.SQLException; 

import org.bukkit.entity.Player; 
import org.bukkit.event.EventHandler; 
import org.bukkit.event.Listener; 
import org.bukkit.event.player.PlayerJoinEvent; 

public class EventListener implements Listener { 

    private Main plugin; 

    public EventListener (Main plugin) 
    { 
     this.plugin = plugin; 
    } 

    MySQLHandler mysql = new MySQLHandler(plugin); 


    @EventHandler 
    public void onJoin(PlayerJoinEvent e) throws SQLException { 
     Player p = e.getPlayer(); 
     String name = p.getName(); 

     mysql.createAccount(name); 

    } 

} 

Может кто-то, возможно, взглянуть на мой код и найти ошибку?

Спасибо, мне действительно нужно знать, как это исправить

+0

Возможно, я был немного неясен. Я пытаюсь зарегистрировать всех в базе данных MySQL со значением Name (имя игрока) и стоимостью (суммой денег) – bramhaag

+0

В коде, который вы указали, я не вижу, что вы вызываете 'MySQLHandler.connect()' в любом месте. Вызывается? – izstas

+0

Он вызывается в основном классе, в onEnable(). Я думал, что код основного класса бесполезен для этого вопроса, поэтому я его не загрузил. – bramhaag

ответ

1

Я думаю, это потому, что вы используете PlayerLoginEvent вместо PlayerJoinEvent. Я не уверен, но вы можете хотя бы попробовать;)

PlayerJoinEvent срабатывает только тогда, когда игрок успешно подключается к серверу, но PlayerLoginEvent также запускается, когда, например, пытается заблокировать проигрыватель.

+0

Я пробовал, но я все еще получаю ту же ошибку. Но спасибо за помощь. Я буду использовать PlayerJoinEvent с этого момента EDIT: я обновил код – bramhaag

1
  1. DONT сохранить имя пользователя. Сохранить UUID> Изменение MC 1.8 позволит вам изменить ваш Ник. Я не буду вдаваться в подробности, google это 100 примеров.

  2. try (PreparedStatement pstat = conn.prepareStatement ("SELECT 1 FROM tokens WHERE name =? LIMIT 1")) // Строка ошибки (строка 102)!

Вы пытаетесь получить колонку «1» из базы данных. Вы уверены, что это колонка, в которой вы нуждаетесь?

В противном случае это, вероятно, Connection conn> Попробуйте отладить его и распечатайте Connection/Check, если вы подключены, прежде чем пытаться создать Statement.

Смежные вопросы