Newsgroup: it.comp.java
Titolo: NullPointerException nella classse ResultSet

Mi appare questa eccezione:
java.lang.NullPointerException
        at org.postgresql.jdbc2.ResultSet.next(ResultSet.java:113)
        at dbmanager.gui.DBManagerFrame.viewTable(DBManagerFrame.java:849)
        at dbmanager.gui.DBManagerFrame.viewAction(DBManagerFrame.java:527)
        at dbmanager.gui.DBManagerFrame.access$1300(DBManagerFrame.java:14)
        at
dbmanager.gui.DBManagerFrame$ListenItemAction.itemStateChanged(DBManagerFram
e.java:436)
        at java.awt.List.processItemEvent(Unknown Source)
        at java.awt.List.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown
Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown
Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
quando eseguo l'istruzione resultset.next(). Io prima determino il numero di
righe di una query eseguendo la query:
SELECT COUNT(*) AS COUNTER FROM TABELLA;
e dopo eseguo la query:
SELECT * FROM TABELLA;
a questo punto inizializzo la tabella con il nuomero di righe ottenuto con
la prima query e comincio ad estrarre i dati. Allego anche la parte del
codice "incriminata"....
private boolean viewTable(ResultSet resultSet, long count) {
 try {
   nRow = (int)count;
   table.setNumRows(nRow);
   System.out.println("Row count: " + nRow);
   ResultSetMetaData metaData = resultSet.getMetaData();
   nColumn = metaData.getColumnCount();
   System.out.println("Column count: " + nColumn);
   table.setNumCols(nColumn + 1);
   labels = new String[nColumn];
   int col = 1;
   for (; col <= nColumn; col++) {
    System.out.println("Column " + col + ": Name " +
metaData.getColumnName(col) +
    " Type name " + metaData.getColumnTypeName(col) + " Type " +
metaData.getColumnType(col));
    table.setColHeaderText(col, metaData.getColumnName(col).toUpperCase());
    labels[col - 1] = metaData.getColumnName(col);
   }
   table.setColHeaderText(col, "");
   if (nRow == 0)
    return true;
   int row = 0;
   while (resultSet.next()) {
    row++;
    System.out.print("Row " + row + ": ");
    for (col = 1; col <= nColumn; col++) {
     System.out.print(resultSet.getString(col) + ", ");
     if (metaData.getColumnTypeName(col).equals("VARCHAR"))
      table.setCellData(col,row,resultSet.getString(col),false);
     else if (metaData.getColumnTypeName(col).equals("LONG"))
      table.setCellData(col,row,new Long(resultSet.getLong(col)),false);
     else if (metaData.getColumnTypeName(col).equals("INTEGER"))
      table.setCellData(col,row,new Integer(resultSet.getInt(col)),false);
     else if (metaData.getColumnTypeName(col).equals("TIMESTAMP"))
      table.setCellData(col,row,resultSet.getTimestamp(col),false);
//     else
//      table.setCellData(col,row,resultSet.getString(col),false);
    }
    System.out.println("");
    table.setCellData(nColumn + 1,row,"",false);
    table.repaintRow(row);
   }
   resultSet.close();
   repaint();
   if (row < nRow) {
    return false;
   }
  } catch (Throwable tEx) {
   tEx.printStackTrace();
   return false;
  }
  return true;
 }
Ho provato anche ad usare un DB MySQL e l'eccezione non si presenta ma non
ottengo tutte le righe che mi aspetto, infatti se la prima query mi
restituisce 16 (numero corretto che verifico con un DB viewer) il ciclo
while si ferma dopo 10 righe. Se anziche prendere tutte le colonne ne prendo
solo 2 o 3 il numero di righe che riesco a leggere con il ciclo while
aumenta progressivamente a mano a mano che diminuisco il numero di
colonne!!!! Che cosa sbaglio? Ho provato ad usare diversi driver per
postgres e mysql ma il problema non cambia.
Antonio

 //      table.setCellData(col,row,resultSet.getString(col),false);
I campi dal ResultSet possono essere recuperati solo nell'ordine in
cui sono richiesti nella SELECT e solo una volta, richiama la
getString() una volta solo e poi usa il valore memorizzato in una
variabile.
Davide

 
Ciao,
davvero? Sei sicuro di quello che dici?
...a parte che cio' che fa Antonio e' proprio questo (nell'ordine e
sempre una sola getXXX()...le varie if non contano), ma a me non risulta che ci siano questi
vincoli (quello sull'ordine sicuramente no).
Saluti
  Lucio
-- 
Lucio Benfante
Brainbench MVP for Java 1
http://www.brainbench.com
MyTranscript: 
http://www.brainbench.com/transcript.jsp?pid=167064

 davvero? Sei sicuro di quello che dici?
Leggi la documentazione di ResultSet se non ci credi.
Davide

On Sat, 06 Apr 2002 11:24:54 +0200, Antonio wrote:
Ciao,
non l'ho provato, ma il codice mi sembra a posto...non e' che riutilizzi
lo stesso ResultSet dopo averne fatto il close()?
Hai provato ad utilizzare lo stesso codice, stralciando la parte relativa
alla JTable?...magari stampando semplicemente sullo standard output?
Un saluto




...accidenti...hai ragione...comunque e' per "maximum portability",
a me non e' mai successo che PosgreSQL protestasse per un'utilizzo "non
ordinato".
Tornando al problema di Antonio, comunque non puo' essere questo, dato
che lui recupera i valori in sequenza ed una sola volta.


 che lui recupera i valori in sequenza ed una sola volta.
C'e' un bellissimo System.out.println, poi una sequenza di IF
di cui almeno uno verra' eseguito. Quindi recupera lo stesso campo
due volte. Comunque non mi pare sia una cosa turce il mettere un
String x;
...
x = resultSet.getString(...);
e poi procedere usando "x" invece di richiamare il getString().
Io comincerei da quello.
Davide

 due volte.
Quindi e' un errore, e' un errore!
uL



ops...mi era sfuggito il println......
beh...per come lo usa, io eliminerei direttamente il getString()...
Object o;
...
o = resultSet.getObject();
...
System.out.println(o)
...e poi, senza tanti test sul tipo della colonna:
table.setCellData(col,row, o,false);
oppure, se setCellData e' in overloading per essere specifico per i vari
tipi (ad esempio):
if (o instanceof Long) {
  table.setCellData(col,row, (Long)o,false);
}
...


 uL
siiiii...fustighiamolo...;-)


 ha scritto nel messaggio
news:sjBr8.66023$S52.2...@news2.tin.it...


 
...quindi ora il tuo metodo dovrebbe essere qualcosa del genere, giusto?
private boolean viewTable(ResultSet resultSet, long count) {
 try {
   nRow = (int)count;
   table.setNumRows(nRow);
   ResultSetMetaData metaData = resultSet.getMetaData();
   nColumn = metaData.getColumnCount();
   table.setNumCols(nColumn + 1);
   labels = new String[nColumn];
   int col = 1;
   for (; col <= nColumn; col++) {
    table.setColHeaderText(col, metaData.getColumnName(col).toUpperCase());
    labels[col - 1] = metaData.getColumnName(col);
   }
   table.setColHeaderText(col, "");
   if (nRow == 0)
    return true;
   int row = 0;
   while (resultSet.next()) {
    row++;
    for (col = 1; col <= nColumn; col++) {
     Object o = resultSet.getObject(col)
     table.setCellData(col,row,o,false);
    }
    table.setCellData(nColumn + 1,row,"",false);
    table.repaintRow(row);
   }
   resultSet.close();
   repaint();
   if (row < nRow) {
    return false;
   }
  } catch (Throwable tEx) {
   tEx.printStackTrace();
   return false;
  }
  return true;
 }
-- 


 
...non c'entra niente, ma perche' il resultSet.close() no lo sposti
all'esterno del metodo?...subito dopo la sua chiamata...e probabilmente
dove (prima della chiamata) apri gli statement, li esegui, e poi (dopo la
chiamata del metodo) li chiudi anche (a meno che no siano Prepared...ma
allora non li devi ricreare ogni volta).
...ci posti anche l'immediato intorno della chiamata?
Lucio


 ha scritto nel messaggio
news:qqCr8.55111$pT1.1...@news1.tin.it...


 
Tu ottieni un ResultSet da un ogetto DBExchParam (mediante
selectStatement). L'unico reference a tale oggetto DBExchParam e' una
variabile locale del metodo selectStatement...quindi quando il metodo
termina, tale reference non esiste piu'...quindi non ci sono piu'
reference a tale oggetto...quindi il JVM Garbage Collector potra' cercare
di distruggerlo...e chiamera' quindi finalize...chiudendo ResultSet,
Statement, ecc...
Che ne dici?
