Newsgroup: it.comp.java
Titolo: Perchè miooggetto[]mioarray=new  miooggetto[2] risulta null?

Perchè il seguente codice produce un errore di nullpointer se miometodo
viene eseguito nel costruttore? Mi sembra di capire che le definizioni delle
variabili esterne a metodi e cotruttore (come quella di mioarray) vengano
eseguite solo dopo il termine dell'esecuzione del costruttore? È così?
public class miaclasse
 {
   private miooggetto[]mioarray=new miooggetto[2];
   //...
  protected void miometodo()
   {
    mioarray[0]=null;
//questa istruzione produce un errore di nullpointer, in quanto mioarray 
risulta null, anche se definito all'inizio dela classe
    mioarray[1]=null;
//***
   }
public miaclasse()
 {
   miometodo();
//***
 }

 Perchè il seguente codice produce un errore di nullpointer
A me non genera nessun null pointer.
Saluti
CarMas

> A me non genera nessun null pointer.
Ovviamente il codice è molto più complesso, ma assicuro che l'UNICO punto 
dove veniva definito mioarray era l'inizio della classe (mi aspettavo che 
venisse inizializzato PRIMA dell'esecuzione del costruttore), ma nel punto 
incriminato risultava null!! Ho risolto inserendo la definizione di mioarray 
in un metodo richiamato dal costruttore. Mi sembra strano, ma sembra che 
l'inizializzazione di variabili tipo
private int[]a=new int[2];
private Object[]b=new Object[5];
venga eseguita dopo il costruttore; quando fino a ieri eseguivo i metodi 
DOPO aver richiamato il costruttore
non avevo mai avuto problemi...
Boh... 

  }
Aspč un attimo, per istanziare un array di oggetti devi fare come 
descritto qui:
http://it.wikipedia.org/wiki/Array_in_Java#Array_di_oggetti
Cioč una volta instanziato un oggetto, poi devi procedere ad istanziare 
ogni oggetto per ogni posizione dell'array. Dal codice che hai postato 
non mi sembra che l'hai fatto. Se non č questo l'errore allora mi scuso 
in anticipo!

 mi sembra che l'hai fatto.
No, non č questo l'errore. In quel punto č giusto che mioarray[0] e 
mioarray[1] siano null, non essendo ancora stati istanziati. Il problema č 
che l'errore viene generato proprio dal tentativo di istanziarli, in quanto 
mioarray stesso (NON miorray[0] e mioarray[1]) risulta null.
Dovrei fare una prova piů semplice per esserne sicuro, ma sembrerebbe 
proprio che l'esecuzione del codice preveda, nell'ordine:
1) esecuzione del costruttore
2) solo alla fine del punto 1, assegnazione di valori indicati al di fuori 
di metodi e costruttori (
p.es
., "private 
miooggetto[]mionome=miooggetto[2];").
Non trovo altra spiegazione, anche perchč scrivendo solo "private 
miooggetto[]mionome;" al posto di "private 
miooggetto[]mionome=miooggetto[2];" e aggiungendo 
"miooggetto[]mionome=miooggetto[2];" nel costruttore o in un metodo da esso 
richiamato, va tutto a posto. Tutto a posto anche se il metodo che istanzia 
miooggetto[0] e miooggetto[1] viene richiamato non dicrettamente o 
indirettamente dal costruttore, ma successivamente. 


Temo tu sia fuori strada...
L'ordine di inizializzazione è esattamente l'opposto.
Controlla bene il tuo codice, magari qualcosa ripunta a null il
reference del tuo array.

> A me non genera nessun null pointer.
Sembra che tu abbia ragione. Il programma seguente va liscio come l'olio. Ci 
capisco sempre di meno.
public class prova
 {
  public static void main(String[]args)
   {new test();}
 }
class miooggetto
 {
  public int a;
  public miooggetto(int a)
   {this.a=a;}
 }
class test
 {
  private miooggetto[]diprova=new miooggetto[2];
  protected void miometodo()
   {
    diprova[0]=null;
//questa istruzione produce un errore di nullpointer, in quanto diprova
//risulta null, anche se definito all'inizio dela classe
    diprova[1]=null;
   }
   public test()
    {miometodo();}
 }

 reference del tuo array.
Cosě sembra, ma [la variabile si chiama resto] cercando in tutti i file le 
occorrenze di "resto=" non trovo altro che la riga che ho riportato... ho 
cercato anche "resto "...
Anche se l'oggetto viene passato in entrata a qualche metodo, quello che puň 
essere ridefinito a null č solo il valore della copia. Diverso il discorso 
per quanto riguarda la modifica dei singoli campi, ovviamente.

 per quanto riguarda la modifica dei singoli campi, ovviamente.
Concordo con pioneer; in particolare miooggetto mi sembra sospetto:
non c'è motivo alcuno, a priori, che il codice di throwsi una NPE.
Verifica o posta codice più completo che sicuramente generi l'errore
che hai segnalato.

 
Prova a fare il debug e guarda se la linea viene eseguita e quanto vale
mioarray quando arrivi a mioarray[0].
L'ordine di istanziazione (quando crei un oggetto) è il seguente:
1. variabili statiche (se non sono state già istanziate)
2. blocco static {} (se non è stato già eseguito)
3. variabili di istanza
4. blocco {}
5. costruttore.