2012-09-04 13 views
8

Mi tufferò rapidamente al problema. Ho una classe sempliceper ogni ciclo non può inizializzare gli oggetti nell'array

class Vector{ 
    float x, y; 
} 

e un'altra classe ha una serie di questi oggetti come suo membro

Vector[] buffer; 

inizializzo così:

buffer = new Vector[8]; 
for(Vector v: buffer) 
    v = new Vector(); 

ma quando provo ad accedere i membri di questo oggetto in questo array ottengo una NullPointerException direttamente nella traccia dello stack. Cioè, gli oggetti dell'array non sono stati costruiti. D'altra parte questo codice più tradizionale funziona semplicemente perfetto:

buffer = new Vector[8]; 
for(int i = 0; i<8; i++) 
    buffer[i] = new Vector; 

Come this discussione lo fa notare, entrambi dovrebbero essere lo stesso dopo la compilazione.

La mia domanda è, perché per ogni ciclo non riesce a inizializzare/costruire oggetti dall'array dell'articolo?

+0

Se si utilizza buffer.length nel ciclo for invece di ripetere 8, sarà sempre corretto per la dimensione dell'array. Altrimenti se cambi un 8 e non l'altro, perderai gli elementi finali o otterrai un'eccezione fuori limite. – n00begon

+0

Era solo per fare un esempio. Assegnare effettivamente buffer.length a una variabile prima del ciclo e utilizzarlo per la condizione è un po 'meglio per le prestazioni, quasi trascurabile, ed è la mia convenzione. – mehmetminanc

+0

Beh, c'è persino una domanda su esattamente quell'ottimizzazione http://stackoverflow.com/questions/1208320/che-è-la-costo-di-calling-array-length – n00begon

risposta

5

Nell'esempio for-each si sovrascrive la variabile locale del ciclo che non viene salvata nell'array. E 'simile al tuo secondo ciclo in corso:

for(int i = 0; i < buffer.length; i++){ 
    Vector v = buffer[i]; 
    v = new Vector(); 
} 

Partenza Understanding for each loop in Java praticamente per lo stesso problema.

5

Entrambi i loop sono gli stessi per che accedono a elementi da un array, ma non per inizializzarli. Quando si utilizza un per-ogni ciclo in questo scenario, è come fare

for(int x = 0; x < array.length; x++) { 
    Vector v = array[x]; 
    v = new Vector(); 
} 

Non sta assegnando il nuovo Vector alla matrice, invece si sta assegnando a una variabile locale.

2

Nel primo esempio, v è disponibile solo all'interno del ciclo for. Quando si esegue v viene aggiornato, ma non il buffer [i]. v stava puntando al buffer [i] prima, ora punta a un nuovo vettore, buffer[i] rimane come null.

Problemi correlati