ENSEIRB Rapport du Projet POO Equipe FFGB : FRESNAIS Marie GRIMAUD Pierre LUCAZEAU Claire MARIN Jean-Baptiste PINSOLLE Cédric Enseignant : M. Eyrolles RSI7 Année scolaire : 2009/2010
Sommaire 1. Lever une exception... 3 2. Capturer une exception... 3 3. Exception contrôlée... 4 Boutez vos neurones... 5 RSI 7 Page 2
1. Lever une exception Expliquer pourquoi une seule exception est levée et non les deux Jauge inverse = creerjauge(78, 13, 0); Jauge egale = creerjauge(-45, -45, -45); Le traitement s arrête et va directement chercher la fonction catch lorsqu il rencontre la première exception sans même traiter les lignes de codes qui suivent, et donc en ignorant la deuxième exception. 2. Capturer une exception Pourquoi faut-il deux blocs try/catch pour s assurer que l exception est bien levée dans tous les cas d instanciation invalide. Comme expliquer dans la partie lever de l exception, il arrête d exécuter le code try lors de la rencontre de la première exception pour aller exécuter le bloc catch, nous avons donc besoin de deux blocs try/catch pour traiter les deux exceptions du code. Quelle est la valeur des variables inverse, egale dans la partie catch? Vérifiez ces valeurs grâce à une assertion. L exécution du bloc try ne peux pas modifier la valeur de ces variables, puisque l instruction est annulée lors du traitement de l exception par le bloc catch. Elles ont donc la même qu à l initialisation dans try, mais ne sont pas accessible dans le bloc catch. Nous avons donc Inverse = (78,13,0) La commande d assertion assert permet de vérifier s il y a une erreur, mais n est pas capable de la réparer. Comment déclarer les variables pour les utiliser à la fois dans la clause try et la clause catch? Il suffit de déclarer les variables avant le bloc try pour que celles-ci puissent être utilisable aussi bien dans la clause try que catch. RSI 7 Page 3
3. Exception contrôlée Ajoutons la méthode suivante à la classe JaugeTest : throw new NullPointerException("Attention"); Donner la classe de base de cette exception? La classe de base est RuntimeException JaugeNaturel inverse = NULL; try { inverse = new JaugeNaturel(78, 13, 0); assert false : "Pas d'exception levee"; catch (IllegalArgumentException e) { System.out.println(inverse.toString()); Compiler et exécuter. Expliquer le résultat. Le système lève une exception NullPointerException, grâce à la commande run() qui appelle le code qui la contient. Remplaçons l exception dans le code précédent par une instance de la classe ClassNotFoundException. La compilation provoque une erreur. Pourquoi cette exception estelle contrôlée et pas la précédente? La classe ClassNotFoundException est de type contrôlée puisqu elle n hérite pas de RuntimeException ; A contrario, la classe IllegalArgumentException hérite de RuntimeException, elle est donc de type non-contrôlée. Ajouter la clause throws ClassNotFoundException dans le prototype de la méthode testexceptioncontrollee(). Compiler. Une erreur apparaît. Comment corriger les autres erreurs sans capturer l exception? Il faut ajouter la clause throws ClassNotFoundExecption à la méthode run() dans la classe Lancertests. Exécuter les tests. Expliquer le résultat. Une exception est apparue dans la console Exception in thread «main» java.lang.classnotfoundexception, car elle n est pas capturer. RSI 7 Page 4
Capturer l exception ClassNotFoundException dans la méthode run(), sans modifier les clauses throws des méthodes. Compiler. L exception est capturée par le run() et elle ne peut donc pas passer dans le catch. Mettre en commentaire la levée de cette exception dans la méthode testexceptioncontrollee(). Compiler. Une erreur de compilation apparaît car l exception n est pas traitée. Le bloc try/catch ne peut pas traiter l exception, puisque celle-ci ne lui est pas remontée. Conclusion : Quel contrôle effectue le compilateur? Le compilateur vérifie que les exceptions soient levées ou gérées à l intérieur du code ou vers des fonctions appelées Boutez vos neurones Est-il possible de préciser une exception non contrôlée dans une clause throws? Oui, cela est possible, mais n est pas indispensable Dans l A.P.I. y-a-t-il plus d exception contrôlée ou non contrôlée? La majorité de ces exceptions sont de type contrôlé. Dans la méthode run() comment transformer l exception contrôlée en une exception non contrôlée? Pour passer d une exception contrôlée à une exception non contrôlée, la gestion des exceptions ( try/catch et throw ) doit être supprimée. Pourquoi la classe AssertionError peut-elle être utilisée dans une instruction throw? Peutelle être capturée? Est-elle contrôlée? La classe AssertionError hérite de la classe Error qui hérite elle-même de la classe Throwable, donc il est logique qu elle puisse être utilisée dans une instruction throw, elle peut également être capturée. La classe AssertionError n hérite pas de RuntimeException, elle ne peut donc pas être contrôlée. D après la documentation de l A.P.I, que représente la classe Error? La classe Error représente un sous-type de la classe throwable. RSI 7 Page 5