Menu

Stackoverflow java

- - Dernière réponse :  jesuisunpseudo - 10 janv. 2019 à 22:26
Bonjour,

J'ai créer quelque classe pour mentrainer en Java (je suis débutant) et j'ai un stackoverflow mais je ne sais pas d'ou vient le problème..

La ligne qu'il affiche est le toString de Voiture ducoup quand je retire cela marche mais alors il maffiche des référence je comprend pas ce que j'ai fait d'incorrect.

Merci

Voici mon main

package salon;

public class GestionSalon {

	public static void main(String[] args) {
		SalonAuto salon = new SalonAuto();

		Utilisateur p1 = new Utilisateur("Gerard");
		p1.ajouterVoiture(new Voiture("1-BGS-462", p1));
		p1.ajouterVoiture(new Voiture("1-FKS-442", p1));

		salon.inscrire(p1);
		System.out.println(salon.toString());

	}

}


Mes différentes classes :

package salon;

public class SalonAuto {

	private Map<Utilisateur, Set<Voiture>> participants;

	public SalonAuto() {
		participants = new HashMap<>();

	}

	public boolean inscrire(Utilisateur participant) {
		participants.put(participant, participant.getVoitures());
		return true;
	}

	public String toString() {
		return participants.toString();
	}

}



package salon;

public class Utilisateur {

	private String nom;
	private Set<Voiture> voitures = new HashSet<>();

	public Utilisateur(String nom) {
		super();
		this.nom = nom;
	}

	public boolean ajouterVoiture(Voiture voiture) {
		if (voitures.contains(voiture))
			return false;
		return voitures.add(voiture);
	}

	public String getNom() {
		return nom;
	}

	public Set<Voiture> getVoitures() {
		return voitures;
	}

	@Override
	public String toString() {
		return "Utilisateur [nom=" + nom + ", voitures=" + voitures + "]";
	}

}



package salon;

public class Voiture {

	private String nrPlaque;
	private Utilisateur proprietaire;

	public Voiture(String nrPlaque, Utilisateur proprietaire) {
		super();
		this.nrPlaque = nrPlaque;
		this.proprietaire = proprietaire;
	}

	public String getNrPlaque() {
		return nrPlaque;
	}

	public void setNrPlaque(String nrPlaque) {
		this.nrPlaque = nrPlaque;
	}

	public Utilisateur getProprietaire() {
		return proprietaire;
	}

	public void setProprietaire(Utilisateur proprietaire) {
		this.proprietaire = proprietaire;
	}

	@Override
	public String toString() {
		return "Voiture [nrPlaque=" + nrPlaque + ", proprietaire=" + proprietaire + "]";
	}

}








Configuration: Windows / Chrome 71.0.3578.98
Afficher la suite 

Votre réponse

1 réponse

Messages postés
15913
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 janvier 2019
3627
0
Merci
Bonjour,

Le problème ce sont les toString de Voiture et Utilisateur.

"Voiture [nrPlaque=" + nrPlaque + ", proprietaire=" + proprietaire + "]";
"Utilisateur [nom=" + nom + ", voitures=" + voitures + "]";

La Voiture affiche le propriétaire, dont on affiche les voitures, pour lesquelles on affiche le propriétaire, duquel on affiche les voitures, qui ont un propriétaire, ayant des voitures, etc.

Tu as une récursivité croisé qui boucle à l'infini, mais la pile d'appel (Stack) est limité, donc au delà de 1024 ça dépasse (Overflow) d'où la StackOverflowError.

Modifies comme tu veux, un des toString voire les deux, mais il ne faut pas d'appel récursifs.
-
D'accord merci je comprend mieux
Commenter la réponse de KX