Problème java.lang.NullPointerException sur ArrayList
Bonjour,
J'ai ce modèle :
Classe Livre étends Classe Article étends Classe Personne avec pour la Classe Personne : (je ne mets ici que les méthodes que j'utilise pour le problème avec des précisions en gras et italique sur les points importants )
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
public class Personne
{
private String nom;
private String prenom;
private LocalDate date_nais;
private ArrayList<Article> oeuvresList; Ici list des oeuvres d'une personne
public Personne()
{
super();
oeuvresList=new ArrayList<> ();
}
public ArrayList<Article> getoeuvresList()
{
return oeuvresList;
} |
pour la Classe Article :
Code:
1 2 3 4 5 6
|
public class Article extends Personne
{
private int reference;
private String designation;
private double prix; |
Pour la Classe Livre :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
public class Livre extends Article
{
private String isbn;
private int nbPages;
private Personne auteur;
public Livre(int reference,String designation,double
prix,String isbn,int nbPages,Personne auteur)
{
super(reference,designation,prix);
setIsbn(isbn);
setNbPages(nbPages);
setAuteur(auteur);
}
public void setAuteur(Personne auteur) {
this.auteur = auteur;
ArrayList<ArticleC> lst;
lst=auteur.getoeuvresList();
if (!lst.contains(this)) ici est le pb lst=null
{
lst.add(this);
}
} |
j'ai rajouté après
Code:
ArrayList<ArticleC> lst;
Code:
1 2
|
lst=new ArrayList<> (); |
Mais ca n'a pas résolu le pb
Niveau exécution :
Code:
1 2 3 4 5 6 7 8 9
|
Livre l1;
l1=new Livre();
l1.setReference(123);
l1.setDesignation("Le Pigeon");
l1.setPrix(20.54);
l1.setIsbn("1245879215");
l1.setNbPages(254);
l1.setAuteur(new Personne("Zone","Eric",LocalDate.of(1978,05,12))); 'Ici le pb |
J'ai l'erreur "Exception in thread "main" java.lang.NullPointerException" si quelqu'un a une idée Merci
Réponse à professeur shadoko (J'ai trouvé la solution)
Citation:
- d'abord une remarque: pourquoi Article étends Personne? C'est plus qu'étrange
Bonjour et merci pour ta réponse, en effet c'est une erreur de ma part, je pensais que puisque Livre utilise :
Code:
1 2 3 4 5 6
|
public class LivreC3 extends ArticleC
{
private String isbn;
private int nbPages;
private Personne auteur; |
et que Livre étends Article je pensais qu'il fallait que Article étende Personne pour que Livre puisse "utiliser"
Code:
1 2
|
]private Personne auteur; |
ben en effet non puisque je l'ai enlevé et pas d'erreur de compilation, il suffit que la classe soit dans le même dossier.
Citation:
- ensuite on n'a pas tous les codes entre les constructeurs sans paramètres (d'ailleurs pourquoi en avoir?) et ceux qui en ont ... on n'a pas les codes...
Te voici les codes en entier des classes : (ne t'étonne pas si les noms des classes finissent pas C ou C3
Classe Personne
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
package Cours.Exos.ExosCorrection;
import java.time.LocalDate;
import java.util.ArrayList;
public class PersonneC
{
private String nom;
private String prenom;
private LocalDate date_nais;
private ArrayList<ArticleC> oeuvresList;
public PersonneC()
{
super();
oeuvresList=new ArrayList<> ();
}
public PersonneC(String n,String p,LocalDate d)
{
this.nom=n;
this.prenom=p;
this.date_nais=d;
}
public PersonneC(String n,String p,LocalDate d,int ref,String des)
{
this.nom=n;
this.prenom=p;
this.date_nais=d;
ArticleC oeuvre;
oeuvre=new ArticleC();
oeuvre.setReference(ref);
oeuvre.setDesignation(des);
oeuvresList=new ArrayList<>();
oeuvresList.add(oeuvre);
}
public ArrayList<ArticleC> getoeuvresList()
{
return oeuvresList;
}
public String getNom()
{
return nom;
}
public void setNom(String nom)
{
this.nom = nom;
}
public String getPrenom()
{
return prenom;
}
public void setPrenom(String prenom)
{
this.prenom = prenom;
}
public LocalDate getDate_nais()
{
return date_nais;
}
public void setDate_nais(LocalDate date_nais)
{
this.date_nais = date_nais;
}
public String toString() {
return prenom + " Classe PersonneC " + nom + " " + date_nais;
}
} |
Classe Article
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
public class ArticleC
{
private int reference;
private String designation;
private double prix;
public ArticleC()
{
super();
}
public ArticleC(int reference)
{
this();
setReference(reference);
}
public ArticleC(int reference,String designation)
{
this(reference);
setDesignation(designation);
}
public ArticleC(int reference,String designation,
double prix)
{
this(reference,designation);
setPrix(prix);
}
public int getReference()
{
return reference;
}
public void setReference(int reference)
{
this.reference = reference;
}
public String getDesignation()
{
return designation;
}
public void setDesignation(String designation)
{
this.designation = designation;
}
public double getPrix()
{
return prix;
}
public void setPrix(double prix)
{
this.prix = prix;
}
public String toString()
{
return "Référence : "+ getReference() + " Désignation : " + getDesignation() +
" Prix : " + getPrix() + " ";
}
} |
Classe Livre ou était le problème je t'ai mis en gras un commentaire sur la ligne ou arrivait le pb
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
import java.time.LocalDate;
import java.util.ArrayList;
public class LivreC3 extends ArticleC
{
private String isbn;
private int nbPages;
private PersonneC auteur;
public LivreC3()
{
super();
}
public LivreC3(int reference,String designation,double
prix,String isbn,int nbPages)
{
super(reference,designation,prix);
setIsbn(isbn);
setNbPages(nbPages);
}
//Constructeur à ne plus utiliser ne gère pas la liste des oeuvres et utilise variable de classe dans fonction
public LivreC3(int reference,String designation,double
prix,String isbn,int nbPages,String nom,String prenom,LocalDate dnaiss)
{
super(reference,designation,prix);
setIsbn(isbn);
setNbPages(nbPages);
auteur=new PersonneC();
auteur.setNom(nom);
auteur.setPrenom(prenom);
auteur.setDate_nais(dnaiss);
}
public LivreC3(int reference,String designation,double
prix,String isbn,int nbPages,PersonneC auteur)
{
super(reference,designation,prix);
setIsbn(isbn);
setNbPages(nbPages);
setAuteur(auteur);
}
public String getIsbn() {
return isbn; }
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public int getNbPages() {
return nbPages;
}
public void setNbPages(int nbPages) {
this.nbPages = nbPages;
}
public PersonneC getAuteur() {
return auteur;
}
/* public void setAuteur(PersonneC auteur) {
this.auteur = auteur;
} */
public void setAuteur(PersonneC auteur) {
this.auteur = auteur;
ArrayList<ArticleC> lst;
lst=new ArrayList<> ();
lst=auteur.getoeuvresList();
if (!lst.contains(this)) le pb était ici lst=null
{
lst.add(this);
}
}
public String toString()
{
return super.toString() +
" Nbre Pages : " + getNbPages() +
" Auteur : " + getAuteur();
}
} |
L'exécution :J'ai modifié et j'ai utilisé l'autre constructeur de la classe Personne et maintenant ça marche
Code:
1 2 3 4 5 6 7 8 9 10 11
|
LivreC3 l,l1;
l1=new LivreC3();
l1.setReference(123);
l1.setDesignation("Le Pigeon");
l1.setPrix(20.54);
l1.setIsbn("1245879215");
l1.setNbPages(254);
l1.setAuteur(new PersonneC("Zone","Eric",LocalDate.of(1978,05,12))); c'est ici que la classe est instanciée et pose problème la ArrayList de type Article vaut null
J'ai modifié et j'ai utilisé l'autre constructeur de la classe Personne et maintenant ça marche
l1.setAuteur(p=new PersonneC("Zone1","Eric1",LocalDate.of(1980, 12,11),l1.getReference(),l1.getDesignation())); |
MErci, si t'as des sugestions je suis preneur
A+