Switch et do while [Résolu/Fermé]

Signaler
-
 helloworld95 -
Bonjour,

Dans le code suivant, je boucle directement après avoir choisi par exemple case 1 et ducoup je ne sais pas continuer la suite de mon programme car le menu reviens directement après.

		char stop = 'o';
		int choix = 0;
		do{
			
			System.out.println("Menu principal : Que voulez-vous faire?");
			System.out.println();
			System.out.println("1 ---> Ajouter un article au panier d'achats");
			System.out.println("2 ---> (PAS ENCORE DISPONIBLE) Supprimer un article du panier d'achats");
			System.out.println("3 ---> Voir tous vos articles");
			System.out.println("4 ---> Quittez le menu et enregistrez vos achats");
			
			choix = scanner.nextInt();
			
			switch (choix) {
			case 1: ajouterArticle();
				break;
			case 3: afficherPanier();
				break;
			}
			
			
		}while(stop != 'n');




1 réponse

Messages postés
16370
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 juillet 2021
2 856
Bonjour,

Est-ce que tu pourrais mieux expliquer ta question et nous fournir le code complet ? Parce qu'en regardant le code que tu nous donnes je ne vois pas de problème, à part la valeur de stop que tu ne passes jamais à 'n'.

D'accord merci, par contre je ne comprend pas pourquoi après avoir fait 'o' pour continuer, il me remets le menu et me redemande directement si je veux continuer et ceci en boucle?

Menu principal : Que voulez-vous faire?

1 ---> Ajouter un article au panier d'achats
2 ---> (PAS ENCORE DISPONIBLE) Supprimer un article du panier d'achats
3 ---> Voir tous vos articles
4 ---> Quittez le menu et enregistrez vos achats
1
Entrez le nom de l'article :
test
Voulez-vous continuez? (o/n)
o
Menu principal : Que voulez-vous faire?

1 ---> Ajouter un article au panier d'achats
2 ---> (PAS ENCORE DISPONIBLE) Supprimer un article du panier d'achats
3 ---> Voir tous vos articles
4 ---> Quittez le menu et enregistrez vos achats
Voulez-vous continuez? (o/n)
1
Menu principal : Que voulez-vous faire?

1 ---> Ajouter un article au panier d'achats
2 ---> (PAS ENCORE DISPONIBLE) Supprimer un article du panier d'achats
3 ---> Voir tous vos articles
4 ---> Quittez le menu et enregistrez vos achats
Voulez-vous continuez? (o/n)
Messages postés
16370
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 juillet 2021
2 856
Sans code impossible de t'aider...

J'ai mis des next() au lieux de nextLine et ca me fait plus cette erreur, par contre dans le code d'ajout de la classe Panier j'ai une nullpointer quand je mais elem.getNom() dans me toString au lieu de elem.



public class Panier {
	
	private Article[] panier;
	private int nbArticles;
	private static final int TAILLE = 50;

	public Panier() {
		this.panier = new Article[TAILLE];
		this.nbArticles = 0;
	}
	
	public int taille(){
		return nbArticles;
	}
	
	public boolean ajouter(Article article){
		if (nbArticles == TAILLE)
			return false;
		panier[nbArticles] = article;
		nbArticles++;
		return true;
	}
	
	public String toString(){
		String aRenvoyer = "";
		for (Article elem : panier){
			aRenvoyer += elem.getNom() + " ";
		}
		return aRenvoyer;
	}
	
	/*public String toString(){
		String aRenvoyer = "";
		String poubelle =  "";
		for (Article elem : panier){
			if (elem == null){
				poubelle += elem + " ";
			}
			if (elem != null){
				aRenvoyer += elem + " ";
			}
		}
		return aRenvoyer;
	}*/

}




import java.util.Scanner;

public class TestPanier {
public static Scanner scanner = new Scanner(System.in);
public static Panier panier = new Panier();
	public static void main(String[] args) {
		
		char stop;
		String choix;
		do{
			
			System.out.println("Menu principal : Que voulez-vous faire?");
			System.out.println();
			System.out.println("1 ---> Ajouter un article au panier d'achats");
			System.out.println("2 ---> (PAS ENCORE DISPONIBLE) Supprimer un article du panier d'achats");
			System.out.println("3 ---> Voir tous vos articles");
			System.out.println("4 ---> Quittez le menu et enregistrez vos achats");
			
			choix = scanner.next();
			
			switch (choix) {
			case "1": ajouterArticle();
				break;
			case "3": afficherPanier();
				break;
			}
			
			System.out.println("Voulez-vous continuez? (o/n)");
			stop = scanner.next().charAt(0);
			
		}while(!(stop == 'n'));

	}// fin main
	
	
	public static void ajouterArticle(){
		int numero = panier.taille();
		System.out.println("Entrez le nom de l'article : ");
		String nomArticle = scanner.next();

		Article article = new Article(nomArticle, numero);
		panier.ajouter(article);
		return;
	}
	
	public static void afficherPanier(){
		if (panier.taille() == 0)
			System.out.println("Votre panier d'achats est vide.");
		System.out.println(panier.toString());
	}
	
}




Menu principal : Que voulez-vous faire?

1 ---> Ajouter un article au panier d'achats
2 ---> (PAS ENCORE DISPONIBLE) Supprimer un article du panier d'achats
3 ---> Voir tous vos articles
4 ---> Quittez le menu et enregistrez vos achats
1
Entrez le nom de l'article :
article1
Voulez-vous continuez? (o/n)
o
Menu principal : Que voulez-vous faire?

1 ---> Ajouter un article au panier d'achats
2 ---> (PAS ENCORE DISPONIBLE) Supprimer un article du panier d'achats
3 ---> Voir tous vos articles
4 ---> Quittez le menu et enregistrez vos achats
1
Entrez le nom de l'article :
article2
Voulez-vous continuez? (o/n)
o
Menu principal : Que voulez-vous faire?

1 ---> Ajouter un article au panier d'achats
2 ---> (PAS ENCORE DISPONIBLE) Supprimer un article du panier d'achats
3 ---> Voir tous vos articles
4 ---> Quittez le menu et enregistrez vos achats
3
Exception in thread "main" java.lang.NullPointerException
at Panier.toString(Panier.java:29)
at TestPanier.afficherPanier(TestPanier.java:51)
at TestPanier.main(TestPanier.java:26)
Messages postés
16370
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
18 juillet 2021
2 856
Il faut savoir lire une exception pour pouvoir la corriger par toi même :

Exception in thread "main" java.lang.NullPointerException
	at Panier.toString(Panier.java:29)
	at TestPanier.afficherPanier(TestPanier.java:51)
	at TestPanier.main(TestPanier.java:26)

Sur la première ligne tu as le nom de thread (tu n'en as qu'un "main" donc peu importe) et la classe de l'exception dont tu peux aller consulter la documentation :
https://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

Ensuite tu as le nom de la classe et la méthode où a été levée l'exception ainsi que le nom du fichier de code et le numéro de ligne où est l'erreur, c'est donc très précis.
Enfin les lignes suivantes permettent de retrouver le contexte d'appel de chaque méthode.

En lisant de bas en haut on peut dire, on peut donc savoir que lorsque l'exception a eu lieu tu étais dans la méthode main sur la ligne 26 de TestPanier.java :
            case "3":
                afficherPanier(); // 26
                break;

Que dans la méthode afficherPanier tu étais sur la ligne 51 de TestPanier.java
    public static void afficherPanier() {
        if (panier.taille() == 0)
            System.out.println("Votre panier d'achats est vide.");
        System.out.println(panier.toString()); // 51
    }

Et enfin que l'exception a eu lieu à ligne 29 de Panier.java :
        for (Article elem : panier) {
            aRenvoyer += elem.getNom() + " "; // 29
        }

Donc en consultant la documentation sur NullPointerException, sur cette ligne là il n'y a qu'une seule explication possible : tu appelles la méthode getNom() alors que elem vaut null...

Et la raison est simple c'est parce que tu affiches un tableau de 50 éléments dont tu as remplis 2 valeurs, mais les 48 suivantes valeurs sont null, et leur affichage plante puisqu'elles n'existent pas...

Il faudrait que tu limites l'affichage au nombre d'articles que contient ton panier.

Merci ca fonctionne !