【问题标题】:resultSet.next() throwing null pointer exceptionresultSet.next() 抛出空指针异常
【发布时间】:2013-03-21 06:45:16
【问题描述】:

我在 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 异常......

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

【问题讨论】:

  • 可以发runSimpleQuery方法吗?
  • 无论您输入什么代码,看起来dbAccess.runSimpleQuery(SQLStatement); 正在返回null..
  • 在数据库中运行SQLStatement 查询,看看是否有任何结果...
  • 你检查过连接对象吗?它是否返回正确的连接?连接可能为空..它被捕获块捕获并返回null
  • 你应该调试那个..通过在 catch 块中打印异常..这样你就可以知道这个null的确切原因

标签: java sql database postgresql resultset


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,我发现如果其他线程使用相同的连接,ResultSet 将在执行其他 sql 后抛出 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 行...我将为此使用特定的连接,并在进程完成后将其丢弃。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-22
        • 2020-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多