NullPointerException quando si crea una matrice di oggetti

Ho cercato di creare un array di una class contenente due valori, ma quando provo ad applicare un valore all’array ottengo una NullPointerException.

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"; } } 

Perché ricevo questo errore e come posso risolverlo?

Hai creato l’array ma non hai inserito nulla, quindi disponi di un array che contiene 5 elementi, tutti null. Potresti aggiungere

 boll[0] = new ResultList(); 

prima della riga in cui si imposta boll [0] .name.

 ResultList[] boll = new ResultList[5]; 

crea una matrice di size = 5, ma non crea gli elementi dell’array.

Devi istanziare ogni elemento.

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

penso chiamando

  ResultList[] boll = new ResultList[5]; 

hai creato una lista che può contenere 5 ResultList, penso che devi inizializzare la boll [0] prima di impostare il valore.

 boll[0] = new ResultList(); 

Come molti hanno già detto nelle risposte precedenti, ResultList[] boll = new ResultList[5]; crea semplicemente un array di ResultList con dimensione 5 dove tutti gli elementi sono nulli. Quando si utilizza boll[0].name , si sta tentando di fare qualcosa come null.name e questa è la causa di NullPointerException. Usa il seguente codice:

 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"; } } 

Qui il ciclo for inizializza fondamentalmente ogni elemento dell'array con un object ResultList e una volta che il ciclo for è completo, puoi usare

 boll[0].name = "iiii"; 

Inoltre, puoi dimostrarlo a te stesso aggiungendo una riga di debug alla tua class, ad esempio:

 public class ResultList { public String name; public Object value; public ResultList() { System.out.println("Creating Class ResultList"); } } 

Ogni volta che viene creato un object, è necessario chiamare uno dei suoi costruttori (se non esiste un costruttore, viene creato automaticamente uno predefinito, simile a quello già presente nella class). Se hai solo un costruttore, l’unico modo per creare un object è chiamare quel costruttore. Se la linea

 ResultList[] boll = new ResultList[5]; 

ho davvero creato 5 nuovi oggetti, vedresti la tua linea di debug apparire sulla console 5 volte. In caso contrario, sai che il costruttore non viene chiamato. Si noti inoltre che la riga precedente non ha un elenco di parametri con parentesi aperte e chiuse “()” quindi non è una chiamata di funzione – o chiamata di costruttore. Invece, ci riferiamo solo al tipo. Stiamo dicendo: “Ho bisogno di spazio per una serie di oggetti ResultList, fino a un totale di 5”. Dopo questa linea, tutto ciò che hai è spazio vuoto, non oggetti.

Mentre provi varie correzioni, la linea di debug ti aiuterà a confermare che stai ottenendo ciò che desideri.

 ResultList p[] = new ResultList[2]; 

Scrivendo questo basta allocare lo spazio per un array di 2 elementi. Dovresti inizializzare la variabile di riferimento in questo modo:

 for(int i = 0; i < 2; i++){ p[i] = new ResultList(); } 
 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); } } 

Finché non hai creato l’object ResultSet ma ogni indice è vuoto che punta al riferimento null che è il motivo per cui ottieni null. Quindi basta assegnare l’object a quell’indice e quindi impostare il valore.

prima di tutto hai creato 5 elementi di tipo ResultList, ma quando inserisci un valore stai inserendo nome e valore errati. è ansible utilizzare il costruttore per creare e inserire valori negli elementi dell’array.

 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"); } 

O puoi provare questo scenario o puoi rendere statica la variabile “name” nella class ResultList. Quindi quando ResultList [] boll = new ResultList [5]; viene eseguito in quel momento tutte le variabili da quella class verranno assegnate

 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() {} }