使用JDBC的NullPointerError

时间:2014-03-09 11:50:43

标签: java mysql jdbc nullpointerexception

我正在尝试将自己的服务器编写为个人项目,但是我遇到了一些问题。我终于完成了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的表,是的,它确实有条目。

2 个答案:

答案 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对象。