尝试打开SQLite连接时出现NullPointerException

时间:2015-06-25 13:02:31

标签: java sqlite minecraft bukkit

我对Java编码比较陌生,所以请耐心等待。我正在尝试为我的Minecraft服务器创建一个Economy插件,用于将余额存储到SQLite数据库中。但是,当我去调用任何命令时,我的代码中会出现一个NPE。让我感到困惑的是,它将我引导回到我在设置检索SQL连接的方法的最开始时定义变量的位置。 我看起来绝对是谷歌的所有地方,通过我自己的自我调试,我不能为我的生活弄清楚什么是错的。

这是堆栈跟踪,包括显示我执行命令/ money的第一行。 堆栈跟踪指向SQLite.java中的第44行,它是文件dataFolder = new File(plugin.getDataFolder(),dbname +“。db”);

[13:35:42] [Server thread/INFO]: Hawkzy issued server command: /money
[13:35:42] [Server thread/ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'money' in plugin HawkzehEco v1.0
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at org.bukkit.craftbukkit.v1_8_R2.CraftServer.dispatchCommand(CraftServer.java:646) ~[spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at net.minecraft.server.v1_8_R2.PlayerConnection.handleCommand(PlayerConnection.java:1139) [spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at net.minecraft.server.v1_8_R2.PlayerConnection.a(PlayerConnection.java:974) [spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at net.minecraft.server.v1_8_R2.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at net.minecraft.server.v1_8_R2.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at net.minecraft.server.v1_8_R2.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [?:1.7.0_75]
        at java.util.concurrent.FutureTask.run(FutureTask.java:262) [?:1.7.0_75]
        at net.minecraft.server.v1_8_R2.SystemUtils.a(SourceFile:60) [spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at net.minecraft.server.v1_8_R2.MinecraftServer.A(MinecraftServer.java:712) [spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at net.minecraft.server.v1_8_R2.DedicatedServer.A(DedicatedServer.java:368) [spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at net.minecraft.server.v1_8_R2.MinecraftServer.z(MinecraftServer.java:651) [spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at net.minecraft.server.v1_8_R2.MinecraftServer.run(MinecraftServer.java:554) [spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        at java.lang.Thread.run(Thread.java:745) [?:1.7.0_75]
Caused by: java.lang.NullPointerException
        at me.hawkzeh.eco.SQLite.getSQLConnection(SQLite.java:44) ~[?:?]
        at me.hawkzeh.eco.SQLite.getBalance(SQLite.java:86) ~[?:?]
        at me.hawkzeh.eco.Commandmoney.onCommand(Commandmoney.java:15) ~[?:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot-1.8.3.jar:git-Spigot-870264a-0a645a2]
        ... 15 more

SQLite.java

package me.hawkzeh.eco;

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;

public class SQLite {
    String dbname;
    Main plugin;
    Connection connection;
    public double balance = 0;
    public String table = "balances";
    public SQLite(Main instance) {
        plugin = instance;
        dbname = "balances";
    }

    public SQLite() {

    }

    public String createBalancesTable =
    "CREATE TABLE IF NOT EXISTS balances (" +
    "`player` varchar(32) NOT NULL," +
    "`balance` double(16) NOT NULL," +
    "PRIMARY KEY (`player`)"+");";


    public void close(PreparedStatement ps, ResultSet rs) {
        try {
            if(ps!=null)
                ps.close();
            if(rs!=null)
                rs.close();
        } catch (SQLException ex) { SQLiteErrorHandler.close(plugin, ex); }
    }
    public Connection getSQLConnection() {
        File dataFolder = new File(plugin.getDataFolder(), dbname+".db");
        if(!dataFolder.exists()) {
            try {
                dataFolder.createNewFile();
            } catch (IOException e) { plugin.getLogger().log(Level.SEVERE, "File write error: "+dbname+".db"); }
        }
        try {
            if(connection!=null&&!connection.isClosed()) {return connection;}
        Class.forName("org.sqlite.JDBC");
        connection = DriverManager.getConnection("jdbc:sqlite:"+dataFolder);
        return connection; } 
        catch (SQLException ex) { plugin.getLogger().log(Level.SEVERE,"SQLite exception on initialize", ex); }
        catch (ClassNotFoundException ex) { plugin.getLogger().log(Level.SEVERE, "You need the SQLite JBDC library. Google it. Put it in /lib folder."); }
        return null;
    }
    public void initialize() {
        connection = getSQLConnection();
        try {
            PreparedStatement ps = connection.prepareStatement("SELECT * FROM "+table+" WHERE player = ?");
            ResultSet rs = ps.executeQuery();
            close(ps,rs); }
        catch (SQLException ex) { plugin.getLogger().log(Level.SEVERE, "Unable to retrieve connection", ex); }
    }

    public void load() {
        connection = getSQLConnection();     
        try {
            Statement s = connection.createStatement();
            s.executeUpdate(createBalancesTable);
            s.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        initialize();
    }

    @SuppressWarnings("resource")
    public Double getBalance(String s) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = getSQLConnection();
            ps = conn.prepareStatement("SELECT * FROM "+table+" WHERE player = '"+s+"';");
            rs = ps.executeQuery();
            while(rs.next()) {
                if(rs.getString("player").equalsIgnoreCase(s.toLowerCase())) {
                    return rs.getDouble("balance"); 
                }
            }
        } catch (SQLException ex) { plugin.getLogger().log(Level.SEVERE, SQLiteErrorHandler.sqlConnectionExecute(), ex); }
        finally {
            try {
                if(ps!=null)
                    ps.close();
                if(conn!=null)
                    conn.close();
            } catch (SQLException ex) { plugin.getLogger().log(Level.SEVERE, SQLiteErrorHandler.sqlConnectionClose(), ex); }
        }
        return 0.0;
    }

    public void setBalance(String s, Double a) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = getSQLConnection();
            ps = conn.prepareStatement("REPLACE INTO "+table+" (player,balance) VALUES (?,?)");
            ps.setString(1, s.toLowerCase());
            ps.setDouble(2, balance);
            ps.executeUpdate();
            return;
        } catch (SQLException ex) { plugin.getLogger().log(Level.SEVERE, SQLiteErrorHandler.sqlConnectionExecute(), ex); }
        finally { try {
            if(ps!=null)
                ps.close();
            if(conn!=null)
                conn.close();
        } catch (SQLException ex) { plugin.getLogger().log(Level.SEVERE, SQLiteErrorHandler.sqlConnectionClose(), ex); }
        } return;
    }
}

最后,这是我的Commandmoney.java ..

package me.hawkzeh.eco;

import net.md_5.bungee.api.ChatColor;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

public class Commandmoney implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender cs, Command cmd, String s, String[] args) {
        if(s.equalsIgnoreCase("money")) {
            SQLite sql = new SQLite();
            double amount = sql.getBalance(cs.getName());
            cs.sendMessage(ChatColor.AQUA+"Balance: "+ChatColor.GREEN+"$"+amount);
            return true;
        }
        return false;
    }
}

0 个答案:

没有答案