Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613

    [Java] Utilizzo StringBuffer array;

    Rieccolo qua...

    Da un database recupero i mei dati e poi devo inserirli all'interno di un array

    public class Connect {

    public StringBuffer[] s;

    public Connect(String host, String db, String user) {

    ...
    ...
    for (int i=1; i<=numColumns; i++){
    this.s[i-1].append(rsmd.getColumnName(i) +": "+ rs.getString(i));
    System.out.print(s[i]);
    }
    }

    i dati vengono recuperati ma al momento dell'esecuzione l'errore rilevato è questo:

    java.lang.NullPointerException.

    Credo di sbagliare l'assegnazione dei valori ad s o addirittura la dichiarazione ma con il manuale a portata di mano non riesco a venirne fuori.

    Grazie per la pazienza

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    E' un errore di NullPointerException: significa che stai facendo riferimento ad un oggetto che non è stato istanziato.
    Hai messo s = new StringBuffer[<intero>] da qualche parte? Se sì, l'hai messo in modo che quando richiami s[i-1] esso risulti istanziato? (per esempio, controlla di non aver istanziato l'array s all'interno di un ramo dell'istruzione if e di richiamarlo al di fuori...

    (Lo stesso vale per gli oggetti rsmd e rs)

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Angelo1974
    Registrato dal
    Feb 2003
    Messaggi
    1,107
    Ciao. Mi sa che hai dimenticato di inizializzare l'array di StringBuffer; infatti tu lo hai dichiarato con:

    public StringBuffer[] s;

    ma così non lo hai ancora inizializzato; esso assumerà il valore di default null; per evitare questo errore dovresti fare una cosa del tipo:

    public class Connect {

    public StringBuffer[] s;

    public Connect(String host, String db, String user) {

    ...
    ...
    s = new StringBuffer[ numColumns ];
    for (int i=1; i<=numColumns; i++){
    this.s[i-1].append(rsmd.getColumnName(i) +": "+ rs.getString(i));
    System.out.print(s[i]);
    }
    }


    Almeno dando 1 sguardo veloce l'errore mi è sembrato quello. Ciao
    Se vuoi trovare l'arcobaleno, devi sopportare la pioggia

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613
    public class Connect {

    public StringBuffer[] s = new StringBuffer[4];

    public Connect(String host, String db, String user) {

    ...
    ...
    for (int i=1; i<=numColumns; i++){
    this.s[i-1].append(rsmd.getColumnName(i) +": "+ rs.getString(i));
    System.out.print(s[i]);
    }
    }

    L'ho cambiato in questo modo ma l'errore è comunque lo stesso. Se non erro "s" in questo modo è una proprietà della classe e con this.s all'interno della funzione costruttrice dovrei essere in grado di "vederla" giusto?
    Però l'errore rimane lo stesso!

    Visto che ci sono faccio anche un'altra domanda.
    Con:
    public StringBuffer[] s = new StringBuffer[4];

    vuol dire che l'array è di 4 elementi.. se poi questi elementi dovessero aumentare è sufficiente riferirsi a questo array con indici maggiori di 3?

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Io proverei a scrivere così:
    codice:
    public class Connect { 
    
       public StringBuffer[] s;
    
       public Connect(String host, String db, String user) { 
    
          s = new StringBuffer[4]; 
    
          ... 
          ... 
          for (int i=1; i<=numColumns; i++){ 
             this.s[i-1].append(rsmd.getColumnName(i) +": "+ rs.getString(i)); 
          System.out.print(s[i]); 
       } 
    }
    Ricordati che anche rsmd e rs devono essere istanziati e inizializzati.

    PS: il this, in questo contesto, è inutile!


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613
    Non so che differenza ci sia tra quello che ho scritto io per ultimo e quello che hai scritto tu, fatto sta che non funzionano entrambi e danno sempre lo stesso errore..

    rsmd e rs vengono istanziate anche perchè il programma sviluppato senza l'array di stringbuffer funziona!

  7. #7
    Utente di HTML.it L'avatar di Angelo1974
    Registrato dal
    Feb 2003
    Messaggi
    1,107
    Prova così:

    public class Connect {

    public StringBuffer[] s;

    public Connect(String host, String db, String user) {

    ...
    ...
    s = new StringBuffer[ numColumns ];
    for (int i=1; i<=numColumns; i++){
    s[ i-1 ] = new StringBuffer(); this.s[i-1].append(rsmd.getColumnName(i) +": "+ rs.getString(i));
    System.out.print(s[i]);
    }
    }


    Sero funzioni... ciao
    Se vuoi trovare l'arcobaleno, devi sopportare la pioggia

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Effettivamente non c'è nessuna differenza, l'avevo scritto lì perchè così si evidenziava il fatto che l'inizializzazione dell'array era allo stesso livello del suo uso.

    Ora mi sorge un dubbio: il metodo append() di StringBuffer (che io non conosco) funziona anche se l'elemento s[i] a cui viene applicato non è stato inizializzato? Alla prima iterazione succede questo:

    s[0] non è ancora stato inizializzato (non ha ancora un valore quindi vale null);
    tu applichi il metodo append() a questo elemento...

    Soluzione: prova a inizializzare tutti gli elementi dell'array con dei valori prima di utilizzare il metodo append(), prova a fare una cosa del genere:

    for(i=0; i<numColumns; i++) s[i] = new StringBuffer();


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Angelo1974 l'ha scritto prima di me...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    613
    Angelo la fornitura di caffè diventa a vita (: grazie a tutti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.