PDA

View Full Version : [Java] Problema serio con una lista


e-commerce84
10-04-2011, 13:13
Ciao,
da ieri stò combattendo con un problema che mi stà facendo impazzire.
Magari è una cavolata ma non riesco a trovare una soluzione.

Allora...dentro al metodo main di una classe chiamata Test ho il seguente codice:


// Lista delle attività nella forma voluta:
ListaAttivita la = new ListaAttivita();

// Lista delle attività restituita dal web service:
it.accenture.danni.services.AnagraficaServicesServiceStub.Attivita[] listaAttivitaWs = attivitaRes.getAttivitaPersonaReturn();
System.out.println("listaAttivitaWs punta a: " + listaAttivitaWs);
System.out.println("listaAttivitaWs ha tipo: " + listaAttivitaWs.getClass());
System.out.println("listaAttivitaWs ha " + listaAttivitaWs.length + " elementi");

System.out.println("Codice Attività prima posizione listaAttivitaWS: " + listaAttivitaWs[0].getCodiceAttivita());
System.out.println("Codice Attività seconda posizione listaAttivitaWS: " + listaAttivitaWs[1].getCodiceAttivita());

for(int i=0; i<listaAttivitaWs.length; i++){
// Creo una nuova attività:
Attivita attivitaCorrente = new Attivita();
// E ne setto i campi:
attivitaCorrente.setCodiceAttivita(listaAttivitaWs[i].getCodiceAttivita());
attivitaCorrente.setCodiceGradoAttivita(listaAttivitaWs[i].getCodiceGradoAttivita());
attivitaCorrente.setCodiceQualifica(listaAttivitaWs[i].getCodiceQualifica());
attivitaCorrente.setCodiceSettore(listaAttivitaWs[i].getCodiceSettore());
attivitaCorrente.setDataFineValidita(listaAttivitaWs[i].getDataFineValidita().getTime());
attivitaCorrente.setDataInizioValidita(listaAttivitaWs[i].getDataInizioValidita().getTime());

System.out.println("L'attività numero " + i + " ha codice: " + attivitaCorrente.getCodiceAttivita());

la.getListaAttivita().add(attivitaCorrente);
}


Inizialmente dichiaro un oggetto la di tipo ListaAttività. (Tale classe ListaAttività al suo interno contiene il seguente campo: private List<Attivita> listaAttivita; (appunto una lista di attività) con i relativi metodi getter e setter). Come si legge nel commento questao oggetto conterrà la lista delle attività nella forma voluta.

Poi sotto ho un altro oggetto chiamato listaAttivitaWs che rappresenta un array (giusto?) di attività che mi vengono restituite da un web service.

Subito sotto ho una serie di istruzioni che mi stampano un po' di output che mi serve per verificare che l'array ricevuto dal web service contenga le corrette informazioni (ed in effetti ottengo i risultati desiderati perchè si trattava appunto di un array di 2 elementi ed i dati contenuti sono in effetti corretti).

Il problema avviene nel ciclo for: praticamente voglio trasferire i dati presenti nell'array ricevuto dal web service all'interno dell'oggetto la di tipo ListaAttivita (o per essere più precisi all'interno del campo private List<Attivita> listaAttivita; che stà dentro l'oggetto la in questione)

Quindi il ciclo for scandisce tutto l'array ricevuto dal web service e ad ogni passo crea un nuovo oggetto chiamato attivitaCorrente di tipo Attivita (da inserire appunto nella lista). Setta correttamente i vari campi di tale oggetto estraendo i dati dai campi dell'array ricevuto dal web service ed infine inserisce l'oggetto all'interno del campo listaAttivita dell'oggetto la tramite l'istruzione la.getListaAttivita().add(attivitaCorrente);

Prima di inserire l'oggetto nella lista ho inserito due output: uno che stampa il riferimento all'oggetto attivitaCorrente e l'altro che mi estrae il valore di un campo di tale oggetto per vedere se funziona tutto bene.

La cosa strana è che: entra nel for, mi crea il primo oggetto di tipo attivitaCorrente, setta correttamente i suoi campi ma poi non inserisce l'oggetto e si schianta tirando su questa eccezione:

[b]Exception in thread "main" java.lang.NullPointerException
at it.capgemini.axamps.motor.contactcenter.ricercaAnagrafica.Test.main(Test.java:127)

Qualche idea in merito?

Grazie mille
Andrea

banryu79
10-04-2011, 13:23
Potrei sbagliare ma, se parte una NullPointerException a questa riga:

la.getListaAttivita().add(attivitaCorrente)

La possibilità è una delle seguenti:
1) la è null
2) getListaAttivita() restituisce un riferimento nullo
3) attivitsCorrente è null e il metodo add è invocato su un'implementazione di una collezione che non accetta elementi nulli.

Leggendo il codice postato escluderei banalmente le possibilità 1) e 3)... resta la 2).
E' sufficiente invocare il costruttore
new ListaAttivita()
per far si che venga istanziata la lista nell'istanza di ListaAttivita e quindi una successiva chiamata a getListaAttivita() ritorni un riferimento non nullo?