2014-05-13 31 views
0

我有一个简单的程序,它使用jconnect6对一个Sybase ASE DB执行查询。 程序迭代为603所的记录的结果集的while(rs.next())的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(); 
     } 
    } 
} 

的输出打印的值进行后抛出一个NullPointerException“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不事到处传递。确保连接也不是空的。我会建议你将这个resultSet合并到'void Test'方法中。 – ErrorNotFoundException

+0

你知道在抛出npe时应该读哪些数据吗?你有这个hdbc驱动程序的源代码吗? – markusw

+0

@Stanley,你是对的,它接近那些603记录是在我关闭连接之前收集到的,并且NPE由于这个错误而被抛出。 –

回答

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; 
} 
+1

正确。一旦你完成,你必须释放连接,而不是之前。而且你不能忘记这样做,否则你会摆脱可用的资源。 –

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(); 
    } 
} 
0

你可以尝试改变:

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

while(rs.next()) ?