resultSet.next()抛出空指针异常

时间:2013-03-30 19:05:57

标签: java sql database postgresql resultset

我正在java中使用JDBC在数据库上执行查询。出于某种原因,这段代码:

public static void checkAllFlights() {
    String SQLStatement = "SELECT Flight.FlightID,"
                            +"(CASE WHEN (SUM(NumSeats) > 0) THEN SUM(NumSeats) ELSE 0 END)"
                            +"AS Booked_Seats,"
                            +"(CASE WHEN (MaxCapacity-SUM(NumSeats) > 0) THEN MaxCapacity-SUM(NumSeats) ELSE MaxCapacity END) AS Available_Seats,"
                            +"MaxCapacity"
                            +"FROM Flight LEFT JOIN FlightBooking ON Flight.FlightID = FlightBooking.FlightID"
                            +"GROUP BY Flight.FlightID, Flight.MaxCapacity"
                            +"ORDER BY Flight.FlightID";

    try {
        dbAccess.getConnection();
        ResultSet resultSet = dbAccess.runSimpleQuery(SQLStatement);
        System.out.println("FlightID "+"Booked_Seats "+"Available_Seats "+"Max_Capacity");      
        while (resultSet.next()) {
            int ID = resultSet.getInt(1);
            System.out.println(ID);
        }
        DBAccess.disconnect();
    } catch (Exception e) {
        e.printStackTrace(System.err);
    } 
}

告诉我错误:

java.lang.NullPointerException
        at databases2.Databases2.checkAllFlights(Databases2.java:245)
        at databases2.Databases2.main(Databases2.java:26)

(“245”行是指“while(resultSet.next())”)

resultSet.next()和resultSet.close()本身也会产生相同的错误。

我已经使用了相同的代码进一步循环结果集并且它工作正常我直接运行SQL并返回正确的结果所以我很困惑为什么resultSet.next()可能会抛出空指针异常吗?

runSimpleQuery方法:

public ResultSet runSimpleQuery(String sql)
        throws Exception {

    try {
        // Create a statement variable to be used for the sql query
        statement = connection.createStatement();

        // Perform the update
        return statement.executeQuery(sql);
    } catch (SQLException e) {
        // Problem encountered
        statement = null;
        return null;
    }

更新:在单步执行之后,看起来runSimpleQuery似乎返回null,除非抛出sql异常,否则它不应该做的事情。

更新:已解决。虽然查询是正确的,显然我搞砸了我的字符串连接,因此它没有包含它应该的空间,并且它在测试时起作用,因为我是一个白痴并通过从代码中复制粘贴而不是拉实际变量来测试查询超出调试器....

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我发现如果其他线程使用相同的连接,则在执行其他sql之后,ResultSet将抛出NullPointerException。

sys.scheduler 06:28:00,017 [SchedulerReloader] ERROR - java.lang.NullPointerException
sys.scheduler 06:28:00,018 [SchedulerReloader] ERROR - com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7009)

我的流程是一个包含200k行的长时间运行过程......我将使用特定的连接并在完成此过程后将其丢弃。

答案 1 :(得分:1)

调试你的runSimpleQuery方法,它返回null,这就是为什么resultset.getNext()抛出NullPointerException

答案 2 :(得分:1)

您检查过connection个对象吗?它回归正常connection?连接可能是null ..并且它被catch block捕获并返回null。你应该通过在catch块中打印exception来调试..所以你可能会知道这个null的确切原因