2014-07-23 54 views
3

我正在嘗試使用MySQL支持製作Bukkit插件。我製作的插件是一個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()中的Main類中被調用。我認爲主要類的代碼對這個問題沒用,所以我沒有上傳它。 – bramhaag

回答

1

我想,那是因爲你使用的是PlayerLoginEvent代替PlayerJoinEvent的。我不確定,但您至少可以試試;)

PlayerJoinEvent僅在玩家成功連接服務器時觸發,但當禁止玩家嘗試連接時也會觸發PlayerLoginEvent

+0

我試過了,但我仍然得到相同的錯誤。但感謝您的幫助。我將從現在開始使用PlayerJoinEvent 編輯:我更新了代碼 – bramhaag

1
  1. 不要保存玩家名稱。保存UUID> MC 1.8更改將允許您更改您的尼克。我不會詳細討論,谷歌有100個例子。

  2. try(PreparedStatement pstat = conn.prepareStatement(「SELECT 1 FROM tokens WHERE name =?LIMIT 1」))// Error line(Line 102)!

你特林從數據庫中獲取列「1」。你確定這是你需要的列嗎?

否則它可能是連接CONN>嘗試調試它並打印出連接/檢查您是否連接,然後再嘗試創建語句。