IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Gestion exception (retourner dans le bloc try)


Sujet :

Langage Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 66
    Points : 49
    Points
    49
    Par défaut Gestion exception (retourner dans le bloc try)
    Bonjour,

    Je code un petit jeu de loi en mode console, et je suis en train de faire le "menu". J'utilise un try catch car je lis l'entrée du clavier via un bufferedReader.
    Mon souci est que lorsque j'attrape l'exception NumberFormatException je voudrais "remonter" dans le try pour ré-afficher le menu du jeu.

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    //Les inits
    		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    		int choixMenu;
     
    		//Affiche le menu
    		for(int i = 0; i<=8; i++){
    			if(i == 0 || i == 8){
    				int k =0;
    				while(k<40){
    					System.out.print("*");
    					k++;
    				}
    			}else if(i == 4){
    				System.out.println("             JEU DE LOI       ");
    			}else{
    				System.out.println("*                                       *");
    			}
    		}
     
    		//l'utilisateur choisi dans le menu
    		try{
    			System.out.println("\nMenu du jeu");
    			System.out.println("1 : Démarrer une partie");
    			System.out.println("2 : Quitter");
     
    			String leChoix = bf.readLine();
    			choixMenu = Integer.parseInt(leChoix);
     
    			switch(choixMenu){
    				case 1:
    					//Instances du plateau 
    					Plateau lePlateau = new Plateau();
    					//lancement d'une partie
    					lePlateau.demarrerPartie();
    					break;
    				case 2:
    					System.out.println("Au revoir. A bientôt !!! ;)");
    					break;
    				default:
    					System.out.println("Entrez un choix valide.");
    					break;
    			}			
    		}catch(IOException e){
    			System.out.println("erreur");
    		}catch(NumberFormatException e2){
    			System.out.println("Vous devez entrez 1 ou 2");
    		}
    Merci d'avance

  2. #2
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    tu peux faire une méthode qui gère l'affichage de ton menu et tu la rappelle dans ton catch...
    Tu pourrais peut être faire des objets qui te permettrais de mieux découper les fonctions de ton appli...

    Bon courage
    ++
    "Aucun de nous ne sait ce que nous savons tous, ensemble."
    Lien vers mon appli Funcash n'hésitez pas à donner votre avis

  3. #3
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 502
    Points
    15 502
    Par défaut
    Une erreur qui n'a rien a voir avec l'informatique, mais si tu parles du jeu ou il faut avancer son pion sur un plateau de 63 cases en lancant des dés, Il s'agit du "Jeu de l'Oie"

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Bonjour,

    J'avoue ne pas être un fan du BufferedReader pour la console.

    Depuis Java 5, on nous fournit un Scanner un peu plus évolué pour ne pas avoir à tout gérer à la main ! Autant que ça serve !

    Voici un exemple d'utilisation pour la lecture d'un int :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import java.util.Scanner;
     
    public class consoleTest {
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		// On lui demande un int
    		System.out.println("int, please!");
    		// Si il ne sais pas tapper au clavier :
    		while (!sc.hasNextInt()) {
    			// On met à jour le scanner pour une nouvelle lecture
    			sc.nextLine();
    			System.out.println("int, please!");
    		}
    		int num = sc.nextInt();
    		System.out.println("Thank you! (" + num + ")");
    	}
    }
    Il te serai possible d'avoir une méthode qui isole ce morceau de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private static int getIntFromUser() {
    		Scanner sc = new Scanner(System.in);
    		// On lui demande un int
    		System.out.println("int, please!");
    		// Si il ne sais pas tapper au clavier :
    		while (!sc.hasNextInt()) {
    			// On met à jour le scanner pour une nouvelle lecture
    			sc.nextLine();
    			System.out.println("int, please!");
    		}
    		return  sc.nextInt();
    	}
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2012
    Messages : 66
    Points : 49
    Points
    49
    Par défaut
    Merci.

    J'ai effectivement créé un fonction start() que je rappel dans le catch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
     
     
    		//Affiche le menu
    		for(int i = 0; i<=8; i++){
    			if(i == 0 || i == 8){
    				int k =0;
    				while(k<40){
    					System.out.print("*");
    					k++;
    				}
    			}else if(i == 4){
    				System.out.println("*           JEU DE LOI                  *");
    			}else{
    				System.out.println("*                                       *");
    			}
    		}
    		start();
     
     
    	}
     
    //Affiche le menu et lance le jeu
    public static void start(){
    	//Les inits
    	BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    	int choixMenu, nbreJoueurs;
    	//l'utilisateur choisi dans le menu
    	try{
    		System.out.println("\nMenu du jeu");
    		System.out.println("1 : Démarrer une partie");
    		System.out.println("2 : Quitter");
     
    		String leChoix = bf.readLine();
    		choixMenu = Integer.parseInt(leChoix);
     
    		switch(choixMenu){
    			case 1:
    				//demande le nombre de joueurs
    				System.out.println("Combien de joueurs y a t-il ?");
    				String leNbreJoueurs = bf.readLine();
    				nbreJoueurs = Integer.parseInt(leNbreJoueurs);
    				//Instances du plateau 
    				Plateau lePlateau = new Plateau();
    				//lancement d'une partie
    				lePlateau.demarrerPartie(nbreJoueurs);
    				break;
    			case 2:
    				System.out.println("Au revoir. A bientôt !!! ;)");
    				break;
    			default:
    				System.out.println("Entrez un choix valide.");
    				start();
    				break;
    		}			
    	}catch(IOException e){
    		System.out.println("erreur");
    		start();
    	}catch(NumberFormatException e2){
    		System.out.println("Vous devez entrez 1 ou 2");
    		start();
    	}
     
    }

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Ce truc ne marche que par hasard. Tu ne peux pas créer plusieurs fois un BufferedReader sur la même entrée. Il faut le créer exactement une fois ni plus ni moins, et toujours utiliser celui-ci.

    ... Et c'est également le cas de Scanner, qui serait bien plus approprié.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    De plus, même si tu as le droit de déclarer plusieurs fois ton Buffer. Il reste qu'il ne faut jamais appeler la méthode qui contient le try-catch du catch qu'on est en train de traiter.
    Parce que cela provoque un empilement des appels à la fonction start(), qui peux provoquer de grave fuite mémoire.
    Par exemple, il m'est possible de faire prendre à ton programme 70 Mo en mémoire. lors de son exécution. Par rapport, à ce qu'il fait c'est ridiculement élevé.

    Voici ce que ça donne au niveau de la stack :
    Thread [main] (Suspended (breakpoint at line 69 in consoleTest))
    consoleTest.start() line: 69
    consoleTest.start() line: 70
    consoleTest.start() line: 70
    consoleTest.start() line: 70
    consoleTest.start() line: 70
    consoleTest.start() line: 70
    consoleTest.start() line: 70
    consoleTest.main(String[]) line: 27
    Sur ce type de programme, il est peu probable que tu arrive à une saturation de la mémoire qui provoque un crash du programme. Mais si tu développe une application plus complexe, cela ne pardonnera pas.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 06/10/2010, 17h06
  2. GESTION D'ERREURS dans un bloc plsql
    Par hoolako dans le forum PL/SQL
    Réponses: 9
    Dernier message: 30/06/2009, 17h59
  3. Faire un return dans un bloc try catch
    Par alizee971 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 13/08/2008, 19h38
  4. Réponses: 8
    Dernier message: 28/04/2004, 16h53
  5. Réponses: 5
    Dernier message: 21/04/2004, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo