我正在尝试将自己的服务器编写为个人项目,但是我遇到了一些问题。我终于完成了Java服务器和C#客户端之间的数据包系统的设置,这让我很开心,尽管我已经得到了一些帮助。无论如何,这是我写的代码,试图让它正常工作。我使用静态变量创建了SQLManager,因为我读到数据库连接应该是静态的,如果这不正确,请告诉我。
这是错误:
线程“main”中的异常java.lang.NullPointerException
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 ) { }
}
显然,ResultSet返回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.
这是我调用查询的地方:
SQLManager.runQuery("select * from \'accounts\'");
任何指针都会非常感激,因为我不确切地知道问题是什么。如果确实出现了这些问题,那么我确实有一个名为accounts的表,是的,它确实有条目。
答案 0 :(得分:1)
表名上有语法错误。表名不应该是文字,而应该用后面的标记引用。除非表名中包含任何特殊字符或者它是保留字,否则这些后退标记是可选的。
正是因为这个错误,语句
return statement.executeQuery(query);
导致异常,该方法为null
返回ResultSet
您最好捕获异常并查看堆栈跟踪对其的说明。
更改:
QLManager.runQuery("select * from \'accounts\'");
致:
QLManager.runQuery("select * from `accounts`");
答案 1 :(得分:1)
您在此代码中遇到问题:
if(rs == null) {
Misc.error("Result Set returned null.");
if(rs.next())
Misc.log("Current Row: " + rs.getRow());
如果checkQuery
方法中发生任何异常,它将为ResultSet
返回null,然后代码将继续rs.next()
,其中rs为null,然后是{{1}会提高。
你所要做的就是:
NullPointerException
但是你必须至少记录错误或在if(rs == null) {
Misc.error("Result Set returned null.");
return false;
}
if(rs.next()) {
Misc.log("Current Row: " + rs.getRow());
return true;
}
中抛出异常以找出你面临的确切问题。不只是返回null对象。