resultSet.next() выдает исключение нулевого указателя

Я работаю в 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" относится к "пока (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 не выбрасывается....

Обновление: решено. Хотя запрос был правильным, очевидно, я испортил свою конкатенацию строк, чтобы она не включала пробелы там, где должна, и это работало при тестировании, потому что я был идиотом и тестировал запрос, копируя-вставляя из кода, а не вытягивая фактическую переменную из отладчика....


person The General    schedule 30.03.2013    source источник
comment
Можете ли вы опубликовать метод runSimpleQuery?   -  person Iswanto San    schedule 30.03.2013
comment
Вы также захотите проверить getConnection(), чтобы убедиться в правильности учетных данных.   -  person CodeGuy    schedule 30.03.2013
comment
из любого кода, который вы вставили, похоже, что dbAccess.runSimpleQuery(SQLStatement); возвращает null..   -  person Vishal K    schedule 30.03.2013
comment
Вероятно, resultSet имеет значение null... Может ли быть так, что runSimpleQuery возвращает значение null, если не находит никаких записей для возврата. Было бы небрежно, но в этом может быть корень проблемы.   -  person fvu    schedule 30.03.2013
comment
запустите запрос SQLStatement в базе данных и посмотрите, выходит ли какой-либо результат...   -  person Vishal K    schedule 30.03.2013
comment
@VishalK: оператор sql работает нормально.   -  person The General    schedule 30.03.2013
comment
Вы проверили объект соединения? он возвращает правильное соединение? возможно, что соединение является нулевым... и оно попало в блок catch и возвращает null   -  person Vishal K    schedule 30.03.2013
comment
@VishalK Да, кажется, и это работает в другом месте.   -  person The General    schedule 30.03.2013
comment
Вы должны отладить это ..., напечатав исключение в блоке catch ... чтобы вы могли узнать точную причину этого null   -  person Vishal K    schedule 30.03.2013
comment
@VishalK Да, только что сделал это. Очевидно, я испортил свою конкатенацию строк, так что она не включала пробелы там, где должна, и это работало при тестировании, потому что я был идиотом и проверял запрос, копируя и вставляя код, а не вытягивая реальную переменную из отладчик. ..   -  person The General    schedule 30.03.2013
comment
@VishalK Спасибо за вашу помощь. Если вы хотите опубликовать один из ваших комментариев в качестве ответа, я отмечу его как принятый.   -  person The General    schedule 30.03.2013
comment
Да, я сделал это.. И больше всего я рад, что это решило вашу проблему.. :)   -  person Vishal K    schedule 30.03.2013


Ответы (3)


Вы проверили connection объект? он возвращает правильный connection ? возможно, что соединение null.. и оно поймано в catch block и возвращает null. Вы должны отладить это ..., напечатав exception в блоке catch ... чтобы вы могли узнать точную причину этого null

person Vishal K    schedule 30.03.2013

Я столкнулся с той же проблемой и обнаружил, что если другой поток использует то же соединение, ResultSet вызовет исключение NullPointerException после выполнения другого sql.

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)

Мой процесс - это длительный процесс с 200 тыс. строк... Я буду использовать для этого определенное соединение и откажусь от него после завершения процесса.

person Rodrigo Asensio    schedule 19.09.2013

Отладьте свой метод runSimpleQuery, он возвращает null, поэтому resultset.getNext() выдает NullPointerException

person Pavel    schedule 30.03.2013