Test sur exception en boucle

LastSolution - 11 mai 2015 à 14:35
 LastSolution - 15 mai 2015 à 10:09
Bonjour,

Je suis sur un petit jeu en console et j'essai de me familiariser avec les Exceptions.

Je souhaiterais que quand le joueur choisisse sa classe ça l'empêche de saisir autre chose que les chiffres proposés (dans mon cas je propose 1 ou 2).

J'ai fait comme montré ci-dessous mais ça me semble bizarre de faire une boucle même si ça a eu l'air d'une bonne idée sur le moment.


		// CHOIX CLASSE
		int verifChoixClasse = 0;
		while(verifChoixClasse == 0)
		{
			verifChoixClasse = 1;
			try
			{
				choixClasse = choixDeLaClasse();
			}
			catch(InputMismatchException e)
			{
				verifChoixClasse = 0;
				System.out.println("Pas de lettres svp !");
			}
		}


le "choixDeLaClasse" appelle :

private static int choixDeLaClasse() 
	{
		// *DEBUT* CHOIX DE LA CLASSE
		
		int choixClasse = 0;
		
		// MARQUE UNE PAUSE
		try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}
		
		System.out.println("------------------------------------------------------------------------------------------------------------------------");
		System.out.println("------------------------------------------------- CHOIX DE VOTRE CLASSE ------------------------------------------------");		
		System.out.println("------------------------------------------------------------------------------------------------------------------------");	
		
		// MARQUE UNE PAUSE
		try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}
		
		System.out.println("Veuillez choisir la classe avec laquelle vous souhaitez combattre : ");
		System.out.println();
		
		// MARQUE UNE PAUSE
		try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}
		
		System.out.println("	1 - Le Mage");
		System.out.println("	2 - Le Guerrier");
		System.out.println();
		
		while(choixClasse < 1 || choixClasse > 2) // GERE LES CLASSES MAGE ET GUERRIER UNIQUEMENT
		{
			System.out.print("	CHOIX : ");
			Scanner choix_personnage = new Scanner(System.in);
			choixClasse = choix_personnage.nextInt();
		}

		return choixClasse;
		// *FIN* CHOIX DE LA CLASSE
	}


Maintenant que je poste cette question je me rend compte que je devrais faire le test dans la méthode appelée au lieu de le faire dans le Main comme je le fais pour ne réafficher que "Choix :" en boucle et non pas tout le reste.
Je modifierais.

Mais la méthode bricolage que j'ai fait est-elle bonne ou y a t'il une méthode très simple pour gérer ça ?

Merci par avance pour toute aide apportée :)

3 réponses

LastSolution
11 mai 2015 à 15:06
Je viens de modifier pour :

Dans le main :

		
// CHOIX CLASSE
choixClasse = choixDeLaClasse();


Et la méthode "choixDeLaClasse" :

	private static int choixDeLaClasse() 
	{
		// *DEBUT* CHOIX DE LA CLASSE
		
		int choixClasse = 0;
		
		// MARQUE UNE PAUSE
		try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}
		
		System.out.println("------------------------------------------------------------------------------------------------------------------------");
		System.out.println("------------------------------------------------- CHOIX DE VOTRE CLASSE ------------------------------------------------");		
		System.out.println("------------------------------------------------------------------------------------------------------------------------");	
		
		// MARQUE UNE PAUSE
		try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}
		
		System.out.println("Veuillez choisir la classe avec laquelle vous souhaitez combattre : ");
		System.out.println();
		
		// MARQUE UNE PAUSE
		try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}
		
		System.out.println("	1 - Le Mage");
		System.out.println("	2 - Le Guerrier");
		System.out.println();
		
		int verifChoixClasse = 0;
		while(verifChoixClasse == 0)
		{
			verifChoixClasse = 1;
			try
			{
				while(choixClasse < 1 || choixClasse > 2) // GERE LES CLASSES MAGE ET GUERRIER UNIQUEMENT
				{
					System.out.print("	CHOIX : ");
					Scanner choix_personnage = new Scanner(System.in);
					choixClasse = choix_personnage.nextInt();
				}
			}
			catch(InputMismatchException e)
			{
				verifChoixClasse = 0;
			}
		}

		return choixClasse;
		// *FIN* CHOIX DE LA CLASSE
	}


Du coup même question : bricole ? Une solution simple existe pour remplacer la gestion en boucle des exceptions comme ça ?
0
LastSolution
15 mai 2015 à 09:19
Petit up svp ! ^^
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
15 mai 2015 à 09:50
Bonjour,

Tu devrais plutôt utiliser des return, c'est plus clair :

import java.util.Scanner;

public class Graphique {
    
    private static final Scanner CLAVIER = new Scanner(System.in);
    
    private static void pause(long millis) 
    {
        try 
        {
            Thread.sleep(millis);
        }
        catch (InterruptedException e) 
        {
        }
    }
    
    private static int choixDeLaClasse() 
    {
        // MARQUE UNE PAUSE
        pause(300);
        
        System.out.println("------------------------------------------------------------------------------------------------------------------------");
        System.out.println("------------------------------------------------- CHOIX DE VOTRE CLASSE ------------------------------------------------");         
        System.out.println("------------------------------------------------------------------------------------------------------------------------"); 
        
        // MARQUE UNE PAUSE
        pause(300);
        
        System.out.println("Veuillez choisir la classe avec laquelle vous souhaitez combattre : ");
        System.out.println();
        
        // MARQUE UNE PAUSE
        pause(300);
        
        System.out.println("    1 - Le Mage");
        System.out.println("    2 - Le Guerrier");
        System.out.println();
        
        while (true)
        {
            System.out.print("      CHOIX : ");
            String choix = CLAVIER.nextLine();
            
            try
            {
                int choixClasse = Integer.parseInt(choix);
                if (choixClasse== 1 || choixClasse== 2) // GERE LES CLASSES MAGE ET GUERRIER UNIQUEMENT
                    return choixClasse;
            }
            catch(NumberFormatException  e)
            {
            }

            System.out.println("      CHOIX INCORRECT : "+choix);
            System.out.println();
        }
    }
    
    public static void main(String[] args) {
        System.out.println(choixDeLaClasse());
    }
}
0
LastSolution
15 mai 2015 à 09:53
Ah oui pour les pauses ça fera plus clair.

Par contre tu aurais une idée pour les vérifications ? C'était ça mon problème principal.
Je vérifie une exception et je la boucle. Tu aurais un truc plus clair ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
15 mai 2015 à 10:07
La boucle est une bonne idée, c'est le test avec verifChoixClasse et la deuxième boucle qui font bidouille mais je les ai enlevé pour les remplacer par un while (true) qui est interrompu par le if quand le résultat correct est renvoyé.

À comparer :

int verifChoixClasse = 0;
while(verifChoixClasse == 0)
{
    verifChoixClasse = 1;

    try
    {
        while(choixClasse < 1 || choixClasse > 2)
        {
            System.out.print("      CHOIX : ");
            Scanner choix_personnage = new Scanner(System.in);
            choixClasse = choix_personnage.nextInt();
        }
    }
    catch(InputMismatchException e)
    {
            verifChoixClasse = 0;
    }
}

return choixClasse;

while (true)
{
    System.out.print("      CHOIX : ");
    String choix = CLAVIER.nextLine();
    
    try
    {
        int choixClasse = Integer.parseInt(choix);
        if (choixClasse== 1 || choixClasse== 2)
            return choixClasse;
    }
    catch(NumberFormatException  e)
    {
    }

    System.out.println("      CHOIX INCORRECT : "+choix);
    System.out.println();
}
0
LastSolution > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
15 mai 2015 à 10:09
Ah oui ! En fait je vérifiais en deux fois alors que tu le fais en une avec un if... Bonne idée ! Plus propre.

Merci j'aime beaucoup :)
0
Rejoignez-nous