Java 使用JDBC的NullPointerError
我试图将自己的服务器作为个人项目来编写,但是遇到了一些问题。我终于完成了Java服务器和C#client之间的数据包系统的设置,这让我非常高兴,尽管我得到了一些帮助。不管怎样,下面是我为使其正常工作而编写的代码。我使用静态变量创建了SQLManager,因为我读到数据库连接应该是静态的,如果这不正确,请告诉我 以下是错误: 线程“main”java.lang.NullPointerException中出现异常Java 使用JDBC的NullPointerError,java,mysql,jdbc,nullpointerexception,Java,Mysql,Jdbc,Nullpointerexception,我试图将自己的服务器作为个人项目来编写,但是遇到了一些问题。我终于完成了Java服务器和C#client之间的数据包系统的设置,这让我非常高兴,尽管我得到了一些帮助。不管怎样,下面是我为使其正常工作而编写的代码。我使用静态变量创建了SQLManager,因为我读到数据库连接应该是静态的,如果这不正确,请告诉我 以下是错误: 线程“main”java.lang.NullPointerException中出现异常 com.fmeg.server.util.SQLManager.runQuery(SQ
com.fmeg.server.util.SQLManager.runQuery(SQLManager.java:37) 下面是我的SQL类:
public static boolean connectToDatabase() {
try {
connection = DriverManager.getConnection(host, credentials[0], credentials[1]);
connected = true;
} catch (Exception e) { connected = false; }
Misc.log("Database: " + database + " || Connection State: " + connected);
return connected;
}
public static boolean runQuery(String query) {
try {
ResultSet rs = checkQuery(query);
if(rs == null)
Misc.error("Result Set returned null.");
if(rs.next())
Misc.log("Current Row: " + rs.getRow());
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
public static ResultSet checkQuery(String query) throws SQLException {
try {
Misc.log(query);
return statement.executeQuery(query);
} catch (Exception e) {
destroyConnection();
return null;
}
}
private static void destroyConnection() {
try {
statement.close();
connection.close();
connected = false;
Misc.error("Database connection destroyed!");
} catch (Exception e ) { }
}
显然,结果集返回null,这是控制台中的输出
[LOG]: Database: Unity3D || Connection State: true
[LOG]: Server <Test Realm> Successfully Started on port: 9955!
[LOG]: select * from `accounts`
[ERROR]: Result Set returned null.
任何指点都将不胜感激,因为我不知道问题出在哪里。若要回答这些问题,请选择“是的,我有一个名为accounts的表,是的,它有条目。”表名有语法错误。表名不应该是文字,而应该用倒钩引起来。这些反勾号是可选的,除非表名中有任何特殊字符或是保留字 正是因为这个错误,语句
return statement.executeQuery(query);
正在导致异常,并且该方法正在为ResultSet
返回一个null
您最好捕获异常并查看stacktrace在其上显示的内容 更改:
QLManager.runQuery("select * from \'accounts\'");
致:
您可以在此代码中找到问题:
if(rs == null) {
Misc.error("Result Set returned null.");
if(rs.next())
Misc.log("Current Row: " + rs.getRow());
如果在checkQuery
方法中发生任何异常,它将为ResultSet
返回一个null,然后代码将继续执行rs。next()
,该值为null,然后将引发NullPointerException
你所要做的就是:
if(rs == null) {
Misc.error("Result Set returned null.");
return false;
}
if(rs.next()) {
Misc.log("Current Row: " + rs.getRow());
return true;
}
但是,您必须至少在
checkQuery
中记录错误或抛出异常,以找出您所面临的确切问题。不只是返回空对象。哪一行是第37行?为什么输出与代码不匹配?为什么在得到异常时返回null,而不是简单地让它在堆栈中冒泡。包含SQL错误消息的清晰SQLException比模糊的NullPointerException更容易分析。停止捕获异常并返回null或更糟的结果:完全忽略异常。如果您已经在日志中记录,您可能还希望将引发的异常记录在checkQuery
中:)@JBNizet我已编辑代码以显示SQLExceptions,但没有引发任何异常。我在runQuery和checkQuery中都这么做了。不可能executeQuery()
返回非空结果集,或引发SQLException。您做错了。您在哪里创建语句
对象?很可能是null
。我的问题更多的是什么导致了空指针,而不是如何避免它。添加了if(rs==null)检查以确保这是原因。导致错误的原因是在checkQuery()
中,您得到一个明确的SQLException,其中包含问题的解释,但是您捕获它,忽略它,并返回null。因此,调用方法的结果集为空checkQuery()
不应该捕获任何异常。这其实并不重要,因为我使用JDBC两种方法都做了,但是我只是为了好玩而更改了它,错误仍然存在。否。语句返回语句.executeQuery(查询)由于语法错误,代码>确定返回了null。捕获异常并查看其消息。
if(rs == null) {
Misc.error("Result Set returned null.");
if(rs.next())
Misc.log("Current Row: " + rs.getRow());
if(rs == null) {
Misc.error("Result Set returned null.");
return false;
}
if(rs.next()) {
Misc.log("Current Row: " + rs.getRow());
return true;
}