我有一个MySQL更新查询,当用户输入/pardon
命令时运行,但我的MySQL PreparedStatement
try / catch正在创建NullPointerException
。
以下是更新的堆栈跟踪:
[19:28:19] [Server thread/WARN]: java.lang.NullPointerException
[19:28:19] [Server thread/WARN]: at net.coded.playerdata.cmds.Pardon.onCommand(Pardon.java:50)
[19:28:19] [Server thread/WARN]: at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[19:28:19] [Server thread/WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:180)
[19:28:19] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_7_R3.CraftServer.dispatchCommand(CraftServer.java:703)
[19:28:19] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_7_R3.CraftServer.dispatchServerCommand(CraftServer.java:690)
[19:28:19] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.DedicatedServer.aB(DedicatedServer.java:296)
[19:28:19] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.DedicatedServer.v(DedicatedServer.java:261)
[19:28:19] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.MinecraftServer.u(MinecraftServer.java:558)
[19:28:19] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.MinecraftServer.run(MinecraftServer.java:469)
[19:28:19] [Server thread/WARN]: at net.minecraft.server.v1_7_R3.ThreadServerApplication.run(SourceFile:628)
以下是课程:
public class Pardon implements CommandExecutor {
@SuppressWarnings("deprecation")
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
if (cmd.getName().equalsIgnoreCase("pardon")) {
if (!sender.hasPermission("bukkit.command.unban.player") || (!sender.isOp())) {
MessageManager.getInstance().severe(sender, ChatColor.RED + "You do not have permission to do that.");
return true;
}
if (args.length == 0) {
MessageManager.getInstance().severe(sender, "You must specify a player name!");
return true;
}
if (args.length >= 1) {
//Unban the player when they are offline
Bukkit.getOfflinePlayer(args[0]).setBanned(false);
Player toUnban = Bukkit.getPlayer(args[0]);
// Update database
try {
Class.forName(PlayerData.driver).newInstance();
Connection conn = DriverManager.getConnection(PlayerData.url + PlayerData.dbName, PlayerData.userName, PlayerData.password);
String query = "UPDATE playerdata SET banned = ?, ban_reason = ? WHERE uuid = ?";
// create the MySQL insert preparedstatement
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setInt(1, 0);
preparedStmt.setString(2, null);
preparedStmt.setString(3, toUnban.getUniqueId().toString());
// execute the preparedstatement
preparedStmt.executeUpdate();
conn.close();
} catch (Exception ex) {
ex.printStackTrace();
}
Command.broadcastCommandMessage(sender, ChatColor.GREEN + "Player " + ChatColor.WHITE + args[0] + ChatColor.GREEN + " has been unbanned.");
return true;
}
}
return true;
}
}
以下是导致此问题的if语句:
if (args.length >= 1) {
//Unban the player when they are offline
Bukkit.getOfflinePlayer(args[0]).setBanned(false);
Player toUnban = Bukkit.getPlayer(args[0]);
// Update database
try {
Class.forName(PlayerData.driver).newInstance();
Connection conn = DriverManager.getConnection(PlayerData.url + PlayerData.dbName, PlayerData.userName, PlayerData.password);
String query = "UPDATE playerdata SET banned = ?, ban_reason = ? WHERE uuid = ?";
// create the MySQL insert preparedstatement
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setInt(1, 0);
preparedStmt.setString(2, null);
preparedStmt.setString(3, toUnban.getUniqueId().toString());
// execute the preparedstatement
preparedStmt.executeUpdate();
conn.close();
} catch (Exception ex) {
ex.printStackTrace();
}
Command.broadcastCommandMessage(sender, ChatColor.GREEN + "Player " + ChatColor.WHITE + args[0] + ChatColor.GREEN + " has been unbanned.");
return true;
}
我尝试为语句/查询创建一个单独的方法,添加finally
子句来关闭连接,而不是在try
中关闭它们。我还尝试在Connection
之前声明PreparedStatement
,try
和查询字符串。我非常确定这主要是有效的代码,因为我已经使用MySQL和Java文档来编写它。我必须遗漏一些东西。非常感谢任何帮助!
答案 0 :(得分:2)
是
preparedStmt.setString(3, toUnban.getUniqueId().toString());
根据您的评论,toUnban
或toUnban.getUniqueId()
似乎是null
值。同样添加调试语句并再次运行以检查:
preparedStmt.setString(2, null);
System.out.println("toUnban null? " + (toUnban==null));
System.out.println("toUnban.getUniqueId() null? " + (toUnban.getUniqueId()==null));
preparedStmt.setString(3, toUnban.getUniqueId().toString());
如果其中一个调试输出指出true
,请调查相应变量为null
的原因。