Java MySQL更新查询产生空指针异常
我有一个MySQL更新查询,当用户键入Java MySQL更新查询产生空指针异常,java,mysql,sql,nullpointerexception,Java,Mysql,Sql,Nullpointerexception,我有一个MySQL更新查询,当用户键入/preference命令时运行,但是我的MySQLPreparedStatementtry/catch正在创建一个NullPointerException 这里是更新的堆栈跟踪: [19:28:19] [Server thread/WARN]: java.lang.NullPointerException [19:28:19] [Server thread/WARN]: at net.coded.playerdata.cmds.Pardon.onCo
/preference
命令时运行,但是我的MySQLPreparedStatement
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 (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;
}
这是课程:
[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 (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;
}
以下是导致问题的if语句:
[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 (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
中关闭连接。我还尝试在try
之前声明连接
,准备语句
,以及查询字符串。我相当肯定这大部分代码都是有效的,因为我使用了MySQL和Java文档来编写这段代码。我肯定错过了什么。非常感谢您的帮助
它是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
任何stacktrace?(请更新问题!不要将堆栈跟踪作为注释发布。)看到了。哪一行是preference.java:54
?Stacktrace并不总是必需的,只需指出哪一条语句产生了错误。@ADTC第54行似乎是:conn.close()代码>@swiftly你说的“似乎是”是什么意思?请查看源代码并检查第54行的语句。您应该能够看到左侧的行号(如果启用了此功能)或编辑器状态栏上的当前行号。另外,我非常怀疑它是conn.close()
,因为conn.prepareStatement
在此之前被调用了几行,所以conn
不能null
。