0

我有一个简单的程序,它使用 jconnect6 对 Sybase ASE DB 执行查询。程序在对 ResultSet 的 603 条记录进行迭代后抛出 NullPointerException

   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)
4

3 回答 3

2

完成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();
    }
}
于 2014-05-13T10:09:43.810 回答
1

我发现在执行查询后

  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;
}
于 2014-05-13T10:06:43.280 回答
0

您可以尝试更改:

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

while(rs.next()) ?
于 2014-05-13T10:14:17.493 回答