Newsgroup: it.comp.java
Titolo: Vector--- Un Bug?

Solo per chi ha pazienza, visto che dovrà sorbirsi qualche riga di
codice....
   while(rs.next())
   {
    copia.setDataFinePrestito(rs.getDate(1));
    utente.setCodUtente(rs.getInt(2));
    utente.setCognome(rs.getString(3));
    utente.setNome(rs.getString(4));
    utente.setTelefono(rs.getString(5));
    copia.setCodCopia(rs.getInt(6));
    libro.setTitolo(rs.getString(7));
    copia.setUtente(utente);
    copia.setLibro(libro);
    vettore.add(copia);
    System.out.println(copia.getDataFinePrestitoFormattata()+"
"+utente.getCodUtente()+" "+utente.getCognome()+" "+utente.getNome());
   }
   for(int i=0; i<vettore.size(); i++)
    {
     Copia copia2=(Copia)vettore.elementAt(i);
     String bo=copia2.getUtente().getCognome();
     System.out.println(bo);
    }
   rs.close();
   ps.close();
  }
Ed ecco il problema: la println della stringa bo, invece di stampare la
getCognome() dell'oggetto Utente contenuto nell'oggetto Copia, stampa SEMPRE
solamente L'ULTIMO elemento inserito!
E' un bug, oppure ci vedete un errore? In quattro non siamo riusciti a
trovare alcun errore (senza contare che in altre pagine, la stessa procedura
funzionava egregiamente).
Ah, dimenticavo, sto parlando di una jsp, con Tomcat 4.0.3 come Application
Server.
e Grazie :)


[CUT CODICE]
Credo che il problema sia che tu durante i cicli dell'iteratore aggiungi
sempre Copia al vector. Dato che Copia è un riferimento, alla fine ad ogni
iterazione tu stai inserendo sempre lo stesso riferimento, cambiando i campi
dell'oggetto a cui punta, che però è sempre lo stesso. Quindi alla fine
delle iterazioni tu hai tutti i campi del vector che puntano alla stessa
area di memoria, dove ovviamente c'è l'ultimo elemento che hai inserito.
Dovresti ridefinire il metodo clone() per la tua classe copia (scrivo copia
perchè non so come si chiama la classe) e poi modificarlo così:
vettore.add(copia.clone());
Questo è quello che viene in mente a me. Spero di essere stato chiaro e
soprattutto di non aver scritto boiate :)
Gianpi

 E' un bug, oppure ci vedete un errore? 
Nessun bug, ma un  errore : stai modificando (ed inserendo) sempre lo 
stesso oggetto (quello riferito da 'copia'). Ovviamente, alla fine del 
while() ti restera' solo l'ultimo.
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 ha scritto nel messaggio
news:ajra9g$tja$1...@newsreader.mailgate.org...

Ciao,
come dicono sia Sadun che Gianpi ... stai inserendo n-volte lo stesso
oggetto!
Se vuoi inserire veramente gli oggetti copia ai cui attributi assegni i
valori della tua tabella basta
che istanzi ad ogni ciclo di while un nuovo oggetto. Allora ti salvi le
referenze ad oggetti diversi
e avrai i valori che ti aspetti.
Ossia
Copia copia= null;
while(rs.next()) {
  copia = new Copia();
  copia.setDataFinePrestito(rs.getDate(1));
  copia.setCodCopia(rs.getInt(6));
  .............
  ............
  vettore.add(copia);
}
a questo punto in vettore hai le referenze alla prima istanza di copia, alla
seconda e alla terza ....
Ciao
Gianluca

Ritorno dalle vacanze estive e mi trovo di fronte al dilemma: allora non è
vero che Java non ha puntantori... :)
E come la spieghi a quelli che passan dal C++ al nostro linguaggio perchè lo
credon piu semplice?
Forse sarebbe giusto far qualche corso di OO per far capire la differenza
tra classe (documento di definizione di oggetto) e istanza (ossia
valorizzazione in un determinato spazio temporale degli attributi di un
oggetto che è stato costruito secondo le specifiche descritte nella
classe)...
Miii.. era meglio che me ne stavo in spiaggia :)
Buon lavoro!
--
--------------------------------
Andrea Musumeci
java programmer free lance
http://www.javalab.it
--------------------------------

credon piu semplice?
Dicendo che i puntatori li gestice Java e che non devono preoccuparsi di
gestire indirizzi esplicitamente e dereferenziare puntatori per lavorare
sull'oggetto puntato.
Ciao
--
Luigi

 non è vero che Java non ha puntantori... :)
http://space.tin.it/computer/csadun/javafaq.html#d1-17
;-)
