Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-Java-BukkitAPI-连接MySQL数据库时出错_Java_Mysql_Bukkit - Fatal编程技术网

MySQL-Java-BukkitAPI-连接MySQL数据库时出错

MySQL-Java-BukkitAPI-连接MySQL数据库时出错,java,mysql,bukkit,Java,Mysql,Bukkit,我正在尝试制作一个支持MySQL的Bukkit插件。我正在制作的插件是一个eco插件,所以我必须把所有玩家的名字都放在一个MySQL表中。我正在使用PlayerJoinEvent在数据库中注册尚未注册的玩家。当我启用插件时,它不会给出任何错误,但当玩家加入时(即当PlayerJoinEvent被触发时),会出现错误 [19:07:54 INFO]: UUID of player behhhans is da772a82-cdc9-3b79-962b-4cdc7623dd7a [19:07:54

我正在尝试制作一个支持MySQL的Bukkit插件。我正在制作的插件是一个eco插件,所以我必须把所有玩家的名字都放在一个MySQL表中。我正在使用PlayerJoinEvent在数据库中注册尚未注册的玩家。当我启用插件时,它不会给出任何错误,但当玩家加入时(即当PlayerJoinEvent被触发时),会出现错误

[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');");
        }
    }

}
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);

     }

}
EventHandler类:

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');");
        }
    }

}
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);

     }

}
有人能看看我的代码,找出错误吗


谢谢,我真的需要知道如何解决这个问题,我想这是因为您使用的是
PlayerLoginEvent
而不是
PlayerJoinEvent
。我不确定,但你至少可以试试;)

PlayerJoinEvent
仅在玩家成功连接到服务器时触发,但是
PlayerLoginEvent
也会在被禁止的玩家尝试连接时触发

  • 不要救玩家的名字。保存UUID>MC 1.8更改将允许您更改您的尼克。我不会详细讲,谷歌有100个例子

  • try(PreparedStatement pstat=conn.prepareStatement(“从name=?LIMIT 1的令牌中选择1”)//错误行(第102行)

  • 您正在尝试从数据库中获取列“1”。你确定那是你需要的专栏吗


    否则可能是连接连接问题,请尝试调试它并打印出连接/在尝试创建语句之前检查是否已连接。

    我可能有点不清楚。我试图在MySQL数据库中注册每个人,在您提供的代码中使用值名称(玩家名称)和值金额(金额),我看不到您在任何地方调用
    MySQLHandler.connect()
    。它被调用了吗?它在主类的onEnable()中被调用。我认为主类的代码对这个问题没用,所以我没有上传。我更新了代码。它仍然不工作,但现在工作得更好:)您是否在
    onEnable()
    方法中调用
    MySQLHandler.connect()
    ?如果不是,那就是问题所在。如果这不是问题所在,那么您的
    MySQLHandler
    类中的第102行在哪里?我尝试过,但仍然得到相同的错误。但是谢谢你的帮助。我将使用PlayerJoinEvent从现在开始编辑:我更新了代码