Exception de pointeur Null, “Tentative de lecture de champ à partir d'une référence d'objet nul”
Je fais une application dans laquelle l'utilisateur tape dans une liste de tâches, et que la liste est enregistrée dans un tableau. Chaque tâche dans le tableau est une instance de la Assignment
classe. Cependant, j'ai réalisé qu'en java il n'est pas possible d'ajouter un élément à un tableau d'après le tableau est créé. Donc, ce que j'ai fait, j'ai créé un tableau appelé tasks
qui se composait de beaucoup de valeurs nulles: Assignment[]tasks = {null, null, null, null, null, null, null, null, null, null, null, null};
. Quand je veux ajouter une tâche au tableau, je viens de remplacer la prochaine valeur null avec l'objet. Cependant, j'ai aussi besoin d'avoir un tableau de simplement des tâches, avec pas de valeurs null. J'ai donc créé un tableau appelé full_tasks
pour tous les éléments qui ne sont pas nulles:
for (Assignment task: tasks) {
if (task != null) {
realLength += 1;
}
}
Assignment[] full_tasks = new Assignment[realLength];
for (int i=0; i <= full_tasks.length - 1; i++) {
full_tasks[i] = new Assignment(tasks[i].name, tasks[i].days_due, tasks[i].time);
}
Alors maintenant, la full_tasks
tableau doit être un tableau de toutes les tâches, qui sont nulles, non? Cependant, lorsque je lance l'application, il ne peut pas lancer l'activité, une erreur qu'il dit est causée par une exception de pointeur null:
Caused by: java.lang.NullPointerException: Attempt to read from field 'java.lang.String com.example.lb.homeworkappv11.Assignment.name' on a null object reference
at com.example.lb.homeworkappv11.Schedule.sortTasks(Schedule.java:64)
La ligne que l'erreur est:
full_tasks[i] = new Assignment(tasks[i].name, tasks[i].days_due, tasks[i].time);
Je ne suis pas encore totalement sûr de ce qu'un objet nul de référence est, mais je pense que cela signifie que l'un des éléments dans la full_tasks
tableau est null. Serait-ce correct? Et si c'est ce que je peux faire pour vous assurer que le full_tasks
tableau est seulement la non-null éléments dans le tasks
tableau?
Merci beaucoup!
Edit: la fonction constructeur de la classe d'assignation est:
public Assignment(String name, int days, int time) {
this.name = name;
this.days_due = days;
this.time = time;
this.toSortBy = "nothing";
}
J'ai ajouté le code ci-dessus
Vérifier ma réponse.
OriginalL'auteur Lucas B | 2015-08-29
Vous devez vous connecter pour publier un commentaire.
Un
null
de référence est juste quenull
. Dans votre code, il esttasks[i].name
où vous essayez d'appelername
surtasks[i]
donctasks[i]
estnull
.Il existe un scénario que je pense, où votre code serait certainement jeter un
NullPointerException
.Donc, je vais assumer vos tâches tableau peut regarder ressemble à ceci:
Puis
full_tasks
aura une taille de 4, maisva jeter un NPE dès que
i == 1
parce quetasks[1]
estnull
.Donc, si vous voulez remplir
full_tasks
avec seulement non-null tâches assurez-vous que vous avez obtenu le droit indices detasks
.OriginalL'auteur Sascha Kolberg
Voici ce que je pense
Vous êtes juste de trouver le nombre d'éléments qui ne sont pas
null
. Vous ne savez pas où dans le tableau thestnull
's sont présents.Supposons que SEUL le premier élément est
null
. DoncrealLength
sera de 7. Le dernierfor
boucle s'exécute dei=0
ài=7
. Lorsquei=0
,tasks[i].name
tente d'accéder à laname
champ du premier élément; mais votre premier élément se trouve être null`. C'est là que les choses vont mal.Solution:
Il y a un certain nombre de solutions. La plus efficace, je pense, utilise un
ArrayList
.De contourner à l'aide de tableaux, vous devez stocker les indices de tous les éléments qui ne sont pas
null
. C'est une façon.Voici un autre:
OriginalL'auteur Saud
Vous pouvez penser à null en tant que quelque chose n'existe pas, par exemple, lorsque vous essayez d'obtenir
task.name
, où la tâche est null, vous obtenez l'erreur, parce que vous essayez d'obtenir le nom de quelque chose qui n'existe même.Réellement ce que votre code est en train de faire maintenant est de vérifier combien de non-nulle d'éléments dans le tableau d'origine, et à essayer d'extraire le supplément n premiers éléments du tableau à un autre tableau.
c'est à dire si la liste est
{null, null, non-null, non-null}
, il dispose de 2 non-null article, mais votre code, à tort, des extraits de la liste de la première 2 éléments qui sont{null, null}
Modifier, de le faire réellement ce que vous voulez:
OriginalL'auteur Derek Fung
Le problème dans votre code est ici:
Bien que vous faites le décompte de la taille réelle, il pourrait être une valeur null dans entre qui est à l'origine pour être obtenir un objet nul à partir de la liste des tâches[i].
Une bonne idée pour résoudre ce est en utilisant une Liste au lieu d'un Tableau. Une Liste peut être augmenté ou diminué comme vous le souhaitez, il vous suffit d'ajouter ou de supprimer un élément de votre type d'objet. Par exemple:
Ensuite, vous pouvez utiliser
list.size()
pour obtenir la taille de savoir combien de points sont là, ou à enlever le dernier élément. Et vous n'aurais pas de problèmes pour ajouter de nouveaux éléments à la liste.OriginalL'auteur George
Il semble que vous essayez de copier et compact, le
tasks
tableau dans lafull_tasks
tableau (en supprimant les éléments null), mais tout ceci est partiellement erronée, car vous accédez àtasks[i]
dans la deuxième boucle sans vérifier si sa valeur est null.Au lieu de:
vous pouvez écrire quelque chose comme ceci:
Mais là encore, pour résoudre votre problème d'origine, concernant le fait que vous ne pouvez pas ajouter des éléments à un tableau, je suggère d'utiliser un
ArrayList
au lieu d'un simple tableau. Cela vous permet d'ajouter des éléments avecArrayList.add(assignment)
et retirez-les de nouveau avecArrayList.remove(index)
.OriginalL'auteur Floern
Semble que les "tâches" de la liste est vide. Assurez-vous que le remplis ou mettre un null vérifier
comme :
OriginalL'auteur Rehman