2009-12-17 12 views
25

He intentado crear una matriz de una clase que contenga dos valores, pero cuando intento aplicar un valor a la matriz obtengo una NullPointerException.NullPointerException al crear una matriz de objetos

public class ResultList { 
    public String name; 
    public Object value; 

    public ResultList() {} 
} 

.

public class Test { 
    public static void main(String[] args){ 
     ResultList[] boll = new ResultList[5]; 
     boll[0].name = "iiii"; 
    } 
} 

¿Por qué me sale este error y cómo puedo solucionarlo?

+0

Podría ser un poco más claro para cambiar el nombre a algo así como resultList NameValuePair. –

+0

¿Sabía que una clase con clave/valor de vinculación ya existe? implementaciones de Map por ejemplo. – enguerran

+3

Un gotcha común procedente de C++, la nueva matriz es una matriz de referencias, pero los objetos reales no se crean. Tienes que crearlos como un paso separado. Java NO permite una matriz de Objetos como C++. –

Respuesta

35

Usted creó la matriz pero no puso nada en ella, por lo que tiene una matriz que contiene 5 elementos, todos los cuales son nulos. Puede agregar

boll[0] = new ResultList(); 

antes de la línea donde configuró boll [0] .name.

+4

Con su creación de instancias, tendrá una matriz de 5 elementos que contiene: {nulo, nulo, nulo, nulo, nulo}. – enguerran

1

Creo llamando

ResultList[] boll = new ResultList[5]; 

que ha creado una lista que puede contener 5 resultList, creo que tiene que inicializar la cápsula [0] antes de establecer el valor.

boll[0] = new ResultList(); 
4
ResultList[] boll = new ResultList[5]; 

crea una matriz de tamaño = 5, pero no crea los elementos de la matriz.

Tiene que instanciar cada elemento.

for(int i=0; i< boll.length;i++) 
    boll[i] = new ResultList(); 
2

Como muchos han dicho en las respuestas anteriores, ResultList[] boll = new ResultList[5]; simplemente crea una matriz de resultList tiene un tamaño de 5 donde todos los elementos son nulos. Cuando usa boll[0].name, intenta hacer algo como null.name y esa es la causa de la NullPointerException. Utiliza el siguiente código:

public class Test { 
    public static void main(String[] args){ 
     ResultList[] boll = new ResultList[5]; 

     for (int i = 0; i < boll.length; i++) { 
      boll[i] = new ResultList(); 
     } 

     boll[0].name = "iiii"; 
    } 
} 

Aquí el bucle básicamente inicializa cada elemento de la matriz con un objeto ResultList, y una vez que el bucle for es completa, se puede utilizar

boll[0].name = "iiii"; 
0

Además, puede probar esto a ti mismo mediante la adición de una línea de depuración a su clase, tales como:

public class ResultList { 
    public String name; 
    public Object value; 

    public ResultList() { 
     System.out.println("Creating Class ResultList"); 
    } 
} 

Siempre que se crea un objeto, uno de sus constructores deben ser llamados (si no hay const ructor, uno por defecto se crea automáticamente, similar al que ya tienes en tu clase). Si solo tiene un constructor, entonces la única forma de crear un objeto es llamar a ese constructor. Si la línea

ResultList[] boll = new ResultList[5]; 

realmente creado 5 nuevos objetos, que se vería su línea de depuración aparecen en la consola 5 veces. Si no lo hace, sabrá que no se está llamando al constructor. Tenga en cuenta también que la línea anterior no tiene una lista de parámetros con abrir y cerrar paréntesis "()" por lo que no es una llamada de función - o llamada de constructor. En cambio, solo nos estamos refiriendo al tipo. Estamos diciendo: "Necesito espacio para una variedad de objetos ResultList, hasta un total de 5". Después de esta línea, todo lo que tienes es espacio vacío, no objetos.

Al probar varias correcciones, la línea de depuración le ayudará a confirmar que está obteniendo lo que desea.

0
ResultList p[] = new ResultList[2]; 

Al escribir esto, solo asigna espacio para una matriz de 2 elementos. Debe inicializar la variable de referencia al hacer esto:

for(int i = 0; i < 2; i++){ 
    p[i] = new ResultList(); 
} 
0

primero de todo lo que han creado 5 elemento del tipo resultList, pero al insertar el valor que va a insertar nombre y valor incorrecto. podrías usar constructor para crear e insertar valores en los elementos de la matriz.

class ResultList { 
    public String name; 
    public Object value; 
    public ResultList(String name,Object value){ 
     this.name = name; 
     this.value = value; 
     System.out.println(name+" --- "+value); 
    } 
} 
public static void main(String[] args) { 
     ResultList[] boll = new ResultList[5]; 
     boll[0] = new ResultList("myName","myValue"); 
    } 
0
class ResultList { 
    public String name; 
    public Object value; 
    public ResultList() {} 
} 
public class Test { 
    public static void main(String[] args){ 
    ResultList[] boll = new ResultList[5]; 
    boll[0] = new ResultList(); //assign the ResultList objet to that index 
    boll[0].name = "iiii"; 
    System.out.println(boll[0].name); 
    } 
} 

Hasta que haya creado el objeto ResultSet pero cada índice está vacío que apunta a null referencia que es la razón por la que está recibiendo nula. Así que solo asigne el Objeto en ese índice y luego establezca el valor.

-1

Cualquiera puede probar este escenario o puede hacer que la variable "nombre" estética en ResultList Class. Entonces, cuando ResultList [] boll = new ResultList [5]; será ejecutado en ese momento todas las variables de esa voluntad de clase se asignan

public static void main(String[] args){ 
     ResultList[] boll = new ResultList[5]; 
    boll[0] = new ResultList(); 
    boll[0].name = "iiii"; 

    System.out.println(boll[0].name); 
    } 


public class ResultList { 

    public static String name; 
    public Object value; 

    public ResultList() {} 
} 
+0

O puede probar el escenario anterior o puede hacer que la variable "nombre" sea estática en ResultList Class. Entonces, cuando ResultList [] boll = new ResultList [5]; se ejecuta en ese momento toda la variable de esa clase se asignará –

+0

¿Podría explicar lo que hizo para solucionar el problema? – Qwertie

+1

Esto ya fue sugerido en varias respuestas. – shmosel

Cuestiones relacionadas