NullPointerException в то время как (rs.next())

У меня есть простая программа, которая выполняет запрос к базе данных Sybase ASE с использованием jconnect6 . программа генерирует исключение NullPointerException после итерации для 603 записей ResultSet

   public ResultSet exec()
{

        ResultSet rs = null;
    try {
        stmt= connection.createStatement();
        rs = stmt.executeQuery(query);
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
    try {
        connection.close();
    } catch (SQLException ex) {
       ex.printStackTrace();
    }
        return rs;
}


public void Test()
{
    ResultSet rs= exec();
    if(rs!=null)
    {
        int i=0;
        try {
            while(rs!=null && rs.next()) {   // NullPointerException here
                System.out.println(i++);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

Выходные данные выводят значение для "i" до тех пор, пока оно не достигнет 603, в то время как количество собранных записей превышает 1000 и ниже - ошибка

May 13, 2014 11:43:43 AM appcomponents.OutageTest Test
SEVERE: null
java.lang.NullPointerException
at com.sybase.jdbc3.timedio.RawDbio.reallyRead(Unknown Source)
at com.sybase.jdbc3.timedio.Dbio.doRead(Unknown Source)
at com.sybase.jdbc3.timedio.InStreamMgr.a(Unknown Source)
at com.sybase.jdbc3.timedio.InStreamMgr.doRead(Unknown Source)
at com.sybase.jdbc3.tds.TdsProtocolContext.getChunk(Unknown Source)
at com.sybase.jdbc3.tds.PduInputFormatter.a(Unknown Source)
at com.sybase.jdbc3.tds.PduInputFormatter.read(Unknown Source)
at com.sybase.jdbc3.tds.TdsInputStream.read(Unknown Source)
at com.sybase.jdbc3.tds.TdsInputStream.readInt(Unknown Source)
at com.sybase.jdbc3.tds.TdsDataObject.readINTN(Unknown Source)
at com.sybase.jdbc3.tds.TdsInt.beginRead(Unknown Source)
at com.sybase.jdbc3.tds.TdsDataObject.doRead(Unknown Source)
at com.sybase.jdbc3.tds.TdsInt.getLong(Unknown Source)
at com.sybase.jdbc3.tds.CachedTdsInt.<init>(Unknown Source)
at com.sybase.jdbc3.tds.TdsInt.createCachedCopy(Unknown Source)
at com.sybase.jdbc3.tds.TdsResultSet.cacheCurrentRow(Unknown Source)
at com.sybase.jdbc3.tds.TdsResultSet.next(Unknown Source)
at com.sybase.jdbc3.jdbc.SybResultSet.next(Unknown Source)
at appcomponents.OutageTest.Test(OutageTest.java:143)

3 ответа

Вы не должны закрывать соединение, пока не закончите чтение из ResultSet,

public ResultSet exec() {

    ResultSet rs = null;
    try {
        stmt = connection.createStatement();
        rs = stmt.executeQuery(query);
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
    return rs;
}

public void Test() {
    ResultSet rs = exec();
    try {
        if (rs != null) {
            int i = 0;
            try {
                while (rs != null && rs.next()) {   // NullPointerException here
                    System.out.println(i++);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    } finally {
        // ** Close your connection AFTER you've finished with the ResultSet
        connection.close();
    }
}

Я обнаружил, что после выполнения запроса в

  rs = stmt.executeQuery(query);

Я закрываю соединение, и это код, который запускается после модификации:

public ResultSet exec()
{

        ResultSet rs = null;
    try {
        stmt= connection.createStatement();
        rs = stmt.executeQuery(query);
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
//        try {
//            connection.close();         //this is what was wrong with the code
//        } catch (SQLException ex) {
//           ex.printStackTrace();
//        }
        return rs;
}

Вы можете попробовать изменить:

 while(rs!=null && rs.next())

к

while(rs.next()) ?
Другие вопросы по тегам