Cégep de Sherbrooke Laboratoire 4 - La gestion des exceptions Buts : Se familiariser avec la gestion des exceptions Exercice 1. Créer un projet que vous nommerez GestionException et faire un programme sans objet (seulement dans le main) qui saisir le nom d’un fichier à l’aide d’un JOptionPane, comme suit : JOptionPane.showInputDialog("Entrer le nom du fichier : "); et tenter de l’ouvrir au maximum 3 fois. Si le fichier n’est pas trouvé, afficher un message d’erreur significatif et redemander son nom. Après 3 essaies, terminer le programme en avertissant l’utilisateur que son nombre de tentatives est dépassée. Lorsque vous ouvrez le fichier, vous en faîtes la lecture (celui-ci contient des doubles, créer le en mettant des nombres avec la virgule et des décimales), vous les additionner et afficher la somme ds un fichier en sortie qui porte le même nom que celui en entree, mais avec le mot somme devant. Répondez aux questions suivantes et regarder si vous avez penser à tout dans votre programme pour faire une bonne gestion d’exeptions: Que se passe-t-il si vous essayez d’ouvrir un fichier en mode lecture, et le fichier n’existe pas ? Que se passe-t-il si vous essayez d’ouvrir un fichier en mode écriture, et le fichier n’existe pas ? Que se passe-t-il si ce n’est pas un nombre qui est entré et qu’il ne peut faire la conversion ? Que se passe-t-il si une méthode lance une exception qui n’a pas de bloc catch associé ? Est-il possible d’avoir deux blocs catch pour la même exception ? Exercice 2. Créer une nouvelle Classe dans ce projet que vous nommerez Entier. Cette classe ne contiendra pas de propriété, mais seulement une méthode du nom de intInput qui nous permettra de saisir en console une string (pour saisir toute une ligne) et celle-ci sera convertie en int ensuite pour s’assurer que c’était bien un entier. Cette méthode affichera l’étiquette reçu en paramètre (qui pourra varier selon l’appel) et retournera l’entier saisi et valide. Si ce n’est pas un entier, elle enverra l’exception approprié (NumberFormatException) qui sera créée et envoyé par la méthode. Ajouter un main à cette classe pour tester ce nouvel objet try { Entier entier = new Entier(); int age = entier.intInput("Entrer votre âge: "); if(age >= 18) System.out.println("Vous pouvez entrer dans les bars à " + age + " ans"); } catch (NumberFormatException e) { //Si la méthode n’a pu convertir en entier System.err.println("Veuillez saisir un entier."); } Ce serait bien de ne pas être obligé d’instancier l’objet entier, comme avec la String ou les Wrappers, comme ceci : int age = Entier.intInput("Entrer votre âge: "); Pour ce faire, vous devez rendre votre méthode static. Page 1 Exercice 3. Vous allez modifier le programme du jeu de dé, pour ajouter la gestion des exceptions et ainsi s’assurer que nos objets Joueur et De sont protégés des paramètres incohérents. Ces 2 objets contiennent des méthodes qui reçoivent des paramètres qui peuvent causer des problèmes majeurs à nos objets, soit Pour Joueur, recevoir un score négatif. Les méthodes qui reçoivent un paramètre qui peut corrompre le score sont : le constructeur qui reçoit un score, le setteur de score et la méthode ajoute qui reçcoit un nombre de points pour ajouter au score. Pour De, recevoir un nombre de faces négatif. Les méthodes qui reçoivent un paramètre qui peut corrompre le nombre de faces sont : le constructeur qui reçoit un nombre de faces et le setteur de nombre de faces. Vous allez donc créer 2 nouveaux objets, ScoreNegativeException et FaceNumberException qui serviront à vos objets Joueur et De a réagir en cas de mauvais paramètres. Ajouter la Javadoc à mesure pour les nouveaux objets et pour les méthodes modifiés dans Joueur et De. Voici l’objet ScoreNegativeException qui hérite de l’objet Exception public class ScoreNegativeException extends Exception { public ScoreNegativeException(String message) { super(message); } } Lors qu’une méthode reçoit un paramètre qui peut causer problème, c’est sa responsabilité de créer et d’envoyer l’exception, comme ceci public void setScore(int score) throws ScoreNegativeException { if(score < 0) throw new ScoreNegativeException("Le score doit être >= 0"); this.score = score; } Et dans le jeu de dé, lors qu’on utilise cette méthode désormais, on doit l’entourer d’un bloc try catch pour attraper cette exception qui est lancé par l’objet, même si le paramètre envoyé est correct. try { … joueur1.setScore(nbPoints); } catch (ScoreNegativeException e) { System.err.println(e.toString()); } Attention, dans votre objet joueur, le constructeur qui set le score devrait maintenant appeler setScrore pour réutiliser le code créer dans le setteur et non le réécrire, comme ceci public Joueur(String nom, int score) throws ScoreNegativeException { this.nom = nom; setScrore(score); //si le score est < 0 setScrore lancera //l’exception qui sera relancé par le constructeur } Page 2