2014-05-13 2 views
0

J'ai un programme simple qui exécute une requête sur une base de données Sybase ASE en utilisant jconnect6. le programme jette un NullPointerException après itérer pour 603 dossiers de ResultSetNullPointerException at while (rs.next())

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

Les impressions de sortie de la valeur pour « i » jusqu'à ce qu'il atteigne 603, tandis que les documents recueillis sont plus de 1000 et au-dessous est l'erreur

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

ResultSets ne sont pas des choses à transmettre autour. Assurez-vous que la connexion n'est pas non plus nulle. Je vous suggérerais d'incorporer ce resultSet dans la méthode 'void Test'. – ErrorNotFoundException

+0

savez-vous quelles données doivent être lues lorsque le npe est lancé? Avez-vous le code source de ce pilote hdbc? – markusw

+0

@Stanley, Vous avez raison, Il semble que ces 603 enregistrements sont ce qui a été recueilli juste avant que je ferme la connexion et le NPE est levé à cause de cette erreur. –

Répondre

1

J'ai trouvé que, après l'exécution de la requête à

rs = stmt.executeQuery(query); 

Je ferme la connexion et c'est le code qui court après la modification:

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

Correct. Vous devez libérer la connexion une fois que vous avez terminé et non avant. Et vous ne devez pas oublier de le faire sinon vous allez sortir des ressources disponibles. –

2

Vous devriez pas fermer votre connexion jusqu'à ce que vous avez terminé la lecture de la 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

Vous pouvez essayer de changer:

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

Pour

while(rs.next()) ?