2012-09-04 21 views
8

Voy a sumergirme rápidamente en el problema. Tengo una clase sencillapara cada bucle no puede inicializar objetos en la matriz

class Vector{ 
    float x, y; 
} 

y otra clase tiene una serie de como su miembro de estos objetos

Vector[] buffer; 

que inicializarlo como esto:

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

pero cuando intento acceder los miembros de este objeto en esta matriz obtengo una NullPointerException directamente a mi rastro de pila. Es decir, los objetos de la matriz no se han construido. Por otro lado este código más tradicional funciona simplemente perfecto:

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

Como this discusión lo señala, ambos deben ser los mismos después de la compilación.

Mi pregunta es, ¿por qué para cada ciclo no puede inicializar/construir objetos de la matriz de elementos?

+0

Si utiliza buffer.length en su bucle for en lugar de repetir 8, siempre será correcto para el tamaño de su matriz. De lo contrario, si cambia uno 8 y no el otro, perderá los elementos finales o obtendrá una matriz fuera de la excepción encuadernada. – n00begon

+0

Fue solo por el bien del ejemplo. En realidad, asignar buffer.length a una variable before para loop y usarlo para la condición es un poco mejor para el rendimiento, casi insignificante, y es mi convención. – mehmetminanc

+0

Bueno, incluso hay una pregunta sobre exactamente esa optimización http://stackoverflow.com/questions/1208320/what-is-the-cost-of-calling-array-length – n00begon

Respuesta

5

En su ejemplo para cada uno, está sobrescribiendo la variable local del bucle que no se guarda en la matriz. Es similar a la de su segundo bucle ir:

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

Salida Understanding for each loop in Java para básicamente el mismo problema.

5

Ambos bucles son los mismos para que acceden a elementos de una matriz, pero no para inicializarlos. Cuando se utiliza un bucle for-cada en este escenario, es como hacer

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

No está asignando el nuevo Vector a la matriz, en lugar va a asignar a una variable local.

2

En su primer ejemplo, v está disponible solo dentro del bucle for. Cuando lo haga, v = new Vector(); v se actualiza, pero no el búfer [i]. v estaba apuntando al búfer [i] antes, ahora apunta a un nuevo vector, buffer[i] permanece como null.

Cuestiones relacionadas