Java 使用JDBC的NullPointerError

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

我试图将自己的服务器作为个人项目来编写,但是遇到了一些问题。我终于完成了Java服务器和C#client之间的数据包系统的设置,这让我非常高兴,尽管我得到了一些帮助。不管怎样,下面是我为使其正常工作而编写的代码。我使用静态变量创建了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 ) { }
}
显然,结果集返回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;
}