web-dev-qa-db-fra.com

NullPointerException lors de la création d'un tableau d'objets

J'ai essayé de créer un tableau d'une classe contenant deux valeurs, mais lorsque j'essaie d'appliquer une valeur au tableau, je reçois une exception 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";
    }
}

Pourquoi ai-je cette erreur et comment puis-je la réparer?

30
marjasin

Vous avez créé le tableau sans rien y insérer. Vous disposez donc d'un tableau contenant 5 éléments, tous nuls. Tu pourrais ajouter

boll[0] = new ResultList();

avant la ligne où vous définissez boll [0] .name.

ResultList[] boll = new ResultList[5];

crée un tableau de taille = 5, mais ne crée pas les éléments du tableau.

Vous devez instancier chaque élément.

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

je pense en appelant

 ResultList[] boll = new ResultList[5];

vous avez créé une liste pouvant contenir 5 ResultList, je pense que vous devez initialiser boll [0] avant de définir la valeur.

boll[0] = new ResultList();
2
ufukgun

Comme beaucoup l'ont dit dans les réponses précédentes, ResultList[] boll = new ResultList[5]; crée simplement un tableau de ResultList ayant une taille de 5 où tous les éléments sont nuls. Lorsque vous utilisez boll[0].name, vous essayez de faire quelque chose comme null.name et c’est la cause de l’exception NullPointerException. Utilisez le code suivant:

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

Ici, la boucle for initialise fondamentalement chaque élément du tableau avec un objet ResultList, et une fois la boucle for terminée, vous pouvez utiliser 

boll[0].name = "iiii";
2
Rishikesh Dhokare
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);
   }
 }

Jusqu'à ce que vous ayez créé l'objet ResultSet, mais que chaque index soit vide et qu'il pointe vers une référence null, c'est la raison pour laquelle vous obtenez null . Il suffit donc d'affecter l'objet à cet index, puis de définir la valeur.

0
Anup

tout d'abord, vous avez créé 5 éléments de type ResultList, mais lorsque vous insérez une valeur, vous insérez un nom et une valeur incorrects. vous pouvez utiliser le constructeur pour créer et insérer des valeurs dans les éléments du tableau.

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
arshadImam

De plus, vous pouvez vous le prouver en ajoutant une ligne de débogage à votre classe, telle que:

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

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

Chaque fois qu'un objet est créé, l'un de ses constructeurs doit être appelé (s'il n'y a pas de constructeur, un constructeur par défaut est créé automatiquement, similaire à celui que vous avez déjà dans votre classe). Si vous n'avez qu'un seul constructeur, le seul moyen de créer un objet est d'appeler ce constructeur. Si la ligne

ResultList[] boll = new ResultList[5]; 

vraiment créé 5 nouveaux objets, vous verriez votre ligne de débogage apparaître 5 fois sur la console. Si ce n'est pas le cas, vous savez que le constructeur n'est pas appelé. Notez également que la ligne ci-dessus n'a pas de liste de paramètres avec des parenthèses ouvrantes et fermantes "()", il ne s'agit donc pas d'un appel de fonction ni d'un appel de constructeur. Au lieu de cela, nous ne faisons référence qu'au type. Nous disons: "J'ai besoin d'espace pour un tableau d'objets ResultList, jusqu'à 5 au total." Après cette ligne, tout ce que vous avez est un espace vide, pas des objets.

Lorsque vous essayez différentes corrections, la ligne de débogage vous aidera à confirmer que vous obtenez ce que vous voulez. 

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

En écrivant ceci, vous allouez de la place pour un tableau de 2 éléments . Vous devriez initialiser la variable de référence en procédant comme suit: 

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