La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

F. Voisin : Introduction à Java 1 Introduction à Java - les exceptions - Frédéric VOISIN FIIFO - « Remise à Niveau »

Présentations similaires


Présentation au sujet: "F. Voisin : Introduction à Java 1 Introduction à Java - les exceptions - Frédéric VOISIN FIIFO - « Remise à Niveau »"— Transcription de la présentation:

1 F. Voisin : Introduction à Java 1 Introduction à Java - les exceptions - Frédéric VOISIN FIIFO - « Remise à Niveau »

2 F. Voisin : Introduction à Java 2 Pourquoi des « exceptions » ? n Gérer des « situations exceptionnelles » u Cas derreurs liées F à lenvironnement (JVM) F à des erreurs de programmation (référence nulle, index de tableaux) à une application/classe particulière ( next() sur un itérateur épuisé) u … ou tout autre événement impliquant une rupture (partielle) du déroulement normal du programme n Mécanisme utile u si on ne sait pas que faire à lendroit où le problème est découvert (on ne peut que le signaler à lappelant, et autrement que textuellement !) u Si on ne sait pas forcément à quel niveau le problème pourra être traité (par défaut on doit propager lalerte)

3 F. Voisin : Introduction à Java 3 Pourquoi des « exceptions » ? (suite) n Signaler explicitement des cas « exceptionnels » u Eviter de procéder par « retour de valeur particulière » qui ne sont pas toujours testées par lappelant u Eviter que les cas « erronés » soient ignorés : une exception non traitée interrompt le programme Eviter dobscurcir les cas « normaux » avec les situations « exceptionnelles » (tester toute référence à null avant usage ? Conversions à partir de Object ? ) n Autoriser des traitements de rattrapage arbitrairement complexes n Autoriser des traitements sélectifs : chaque méthode décide quels cas exceptionnels elle sait traiter et quels cas relèvent des méthodes appelantes.

4 F. Voisin : Introduction à Java 4 « Gérer » une exception ? Signaler une situation exceptionnelle (« lever une exception ») throw instance dexception ; Se protéger vis-à-vis dune situation exceptionnelle, si on est capable de la prendre en compte (rattraper une exception) ! try { liste dinstructions } // bloc protégé ! catch ( ClasseException1 variable ){ traitement correctif 1 } catch ( ClasseException2 variable ){ traitement correctif 2 } … u Propager (explicitement ou implicitement) une exception quon ne sait pas traiter complètement Souvent on est amené à combiner traitement local + propagation à lappelant (sous le même nom dexception ou un autre !)

5 F. Voisin : Introduction à Java 5 Quest-ce quune (classe) dexception ? Une exception = une instance dune classe membre dune hiérarchie (extensible) de classes, de racine Throwable Error, Exception, RunTimeException, IOException, … n Une classe dexception est une classe « ordinaire », avec éventuellement des constructeurs, des attributs, des méthodes Méthodes héritées de Throwable : F getMessage() F toString() printStackTrace() // historique de propagation F fillInStackTrace() + une description du contexte dexécution au moment de la levée de lexception n Les règles de typage classiques (classe/sous-classes) sappliquent ! n On peut donc organiser ses exceptions en hiérarchie

6 F. Voisin : Introduction à Java 6 class java.lang.Throwable sous-classe directe de Object !Throwable class java.lang. Error Difficilement rattrapables ! Error class java.lang.VirtualMachineErrorVirtualMachineError class java.lang.OutOfMemoryErrorOutOfMemoryError … class java.lang. Exception Exception class java.lang. RuntimeException trop fréquentes pour quon oblige RuntimeException class java.lang.ArithmeticExceptionà les signaler à lavance !ArithmeticException class java.lang.ClassCastExceptionelles peuvent donc survenir partout…ClassCastException class java.lang.IllegalArgumentExceptionIllegalArgumentException class java.lang.IllegalThreadStateExceptionIllegalThreadStateException class java.lang.NumberFormatExceptionNumberFormatException class java.lang.IndexOutOfBoundsExceptionIndexOutOfBoundsException class java.lang.ArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsException class java.lang.StringIndexOutOfBoundsExceptionStringIndexOutOfBoundsException class java.lang.NegativeArraySizeExceptionNegativeArraySizeException class java.lang.NullPointerExceptionNullPointerException class java.util.NoSuchElementExceptionNoSuchElementException … class java.io.IOException(voir transparent suivant !) Ici prochainement, vos exceptions !

7 F. Voisin : Introduction à Java 7 La sous-hiérarchie « IOException » Pour gérer toute exception liée aux E/S il suffit de rattraper IOException On peut traiter de façon spécifique des cas particuliers (ex. les exceptions FileNotFoundException et EOFException ).

8 F. Voisin : Introduction à Java 8 Spécification des exceptions n Une méthode doit déclarer explicitement les exceptions quelle est susceptible de lever : public void f(…) throws E1, E2 { … } le corps de f ne peut lever que les exceptions de classe E1 ou E2 f doit se préoccuper des exceptions levées par les méthodes quelle appelle F soit en les rattrapant F soit en les propageant (et en le déclarant dans son en-tête) Lappelant de f sait donc contre quelles exceptions se prémunir… Toute redéfinition de f dans les sous-classes devra respecter ce profil …mais rien nempêche de lever une exception plus spécifique (sous-classe) Exemple: toute redéfinition de equals(Object O) ne peut lever que des instances (au sens large) de RuntimeException ou Error. La règle sapplique aussi à la méthode main !

9 F. Voisin : Introduction à Java 9 Spécification des exceptions (exemple) import java.util.Calendar; public class RnDate { public RnDate(int year, int quantieme) throws ErreurDate { … refuse RnDate(2003, 366) ou RnDate(2003, -1) ! } // KO : lexception nest ni rattrapée, ni « déclarée » // Rejeté, même si en pratique lexception ne peut pas se produire ! public static RnDate aujourdhui() { Calendar date = Calendar.getInstance(); return new RnDate(date.get(Calendar.YEAR), date.get(Calendar.DAY_OF_YEAR)); }

10 F. Voisin : Introduction à Java 10 Spécification des exceptions (suite) A titre dérogatoire, il est facultatif de spécifier la levée des exceptions des hiérarchies Error et RunTimeException public void f(…) { … } ne peut donc lever/propager que des exceptions de classe Error ou RunTimeException, difficilement rattrapables public void f(…) throws Throwable { … } peut lever des exceptions arbitraires mais laisse une (trop) lourde charge à ses appelants et est peu coopérative

11 F. Voisin : Introduction à Java 11 Levée, récupération et propagation dexceptions n Une rupture du déroulement normal du programme… : u arrêt du déroulement normal du programme pour rechercher dynamiquement un traite-exception adapté u Ce traitement remplace le traitement normalement effectué, sans possibilité de retour… n Levée implicite par la JVM ou une classe existante: String[] tab = new String[0]; Integer I; … ; System.out.println(Integer.intValue(I)); new Arraylist().iterator().next(); n Levée explicite par le code du programmeur: throw new MonException();

12 F. Voisin : Introduction à Java 12 try { f 1 (); … f N (); } // bloc protégé catch (E 1 v) { instructions } // des traites-exceptions (« handlers »)… … catch (E p v) { instructions } // … en nombre quelconque Les catch sont examinés dans lordre jusquà trouver le premier qui correspond (modulo le sous-typage). Le compilateur vérifie que tout catch est accessible. Le traite-exception retenu remplace la fin du traitement du bloc try et continue à sa suite, avec les mêmes contraintes (type dune valeur retournée, exceptions levées, etc.) A vous de conserver suffisamment dinformation sur le contexte pour traiter lexception (quel appel f i () a provoqué lexception ?) Levée, récupération et propagation dexceptions

13 F. Voisin : Introduction à Java 13 Récupération dexceptions (suite) n Un catch peut lui-même lever une exception la même : ou une autre : catch (Exception e) { traitement local throw e;throw newMonException(); } mais une exception levée dans un catch nest jamais rattrapable dans le même bloc try/catch. Les try/catch peuvent englober dautres blocs try/catch En labsence de catch adapté, propagation automatique de lexception au bloc englobant (où la même recherche de bloc catch aura lieu)

14 F. Voisin : Introduction à Java 14 Récupération dexceptions (fin) Attention à la portée des try/catch : f(Iterator it) { try { while (true) while (true) try { it.next(); it.next(); }catch (…) { … } } catch (…) { … } }

15 F. Voisin : Introduction à Java 15 Levée, récupération et propagation dexceptions Recherche, selon limbrication des try/catch, dun traite-exception adapté u Si on en trouve un : lexécution continue à partir de ce point de la méthode u Sinon, lexécution de la méthode est interrompue et lexception est signalée chez lappelant, au point dappel… On remonte donc dynamiquement la chaîne dappels de méthodes jusquà éventuellement la méthode main initiale Si lexception nest jamais rattrapée, il y a interruption du programme… n On ne rattrape pas si on ne sait pas quoi en faire… n On ne rattrape pas si cest juste pour propager !

16 F. Voisin : Introduction à Java 16 Exceptions et constructeurs Attention aux exceptions dans les constructeurs : u Dans quel état laisse-t-on linstance concernée (initialisation partielle) ? u Quest-ce que lutilisateur pourra faire avec linstance concernée ? n Une exception levée dans un constructeur nest jamais récupérable dans un autre constructeur public RnDate(int year, int quant) throws ErreurDate { … } public RnDate() { this(year, today); // Comment la rattraper ? } n Même problème pour la liaison constructeur sous-classe/super-classe ! n Le constructeur de la sous-classe peut avoir des exceptions différentes…

17 F. Voisin : Introduction à Java 17 La clause « finally » try { instructions } catch (Exception1 e1) { … } … … … // traites-exceptions optionnels } catch (ExceptionN eN) { } finally { instructions } // clause optionnelle n Rôle : garantir quun fragment de code est exécuté dans tous les cas, normaux ou avec des exceptions, rattrapées ou non ! n Précautions dusage : u attention aux doubles traitements attention à ne pas lever dexceptions dans le bloc finally !

18 F. Voisin : Introduction à Java 18 La clause « finally » : exemple class MonException extends Exception {} public class TestFinally { // adapté de B. Eckel: "Thinking in Java" public static void main(String[] args) { int count = 0; while (true) try { if (count == 0) { count++; throw new MonException(); } else if (count == 2) throw new NullPointerException(); else { count++; System.out.println("Cas normal"); } } catch (MonException e) { System.out.println("Dans le traite-exception"); } finally { System.out.println("Dans le bloc finally");} } Question : quels sont les affichages réalisés ?

19 F. Voisin : Introduction à Java 19 La clause « finally » dans les boucles … class MonException extends Exception {} public class TestFinally2 { // adapte de B. Eckel: "Thinking in Java" public static void main(String[] args) { int count = 0; while (count < 10) try { count++; if (count % 2 == 0) continue; else if (count == 7) break; else System.out.println("Cas normal: " + count); } finally { // Exécuté dans les 3 cas... System.out.println("Dans le bloc finally: " + count); }

20 F. Voisin : Introduction à Java 20 Eléments méthodologiques n On anticipe (i.e. on évite lexception par un test explicite) ou on rattrape lexception ? Privilégier la correction du code et sa lisibilité n Une partie intégrante de la conception dune classe u Qui lève quoi ? Aussi important que les types des paramètres ! u Quel niveau de détail : F quelle interface (attributs, méthodes) ? F Quelle hiérarchie dans les exceptions ?

21 F. Voisin : Introduction à Java 21 Eléments méthodologiques : qui rattrape quoi ? n Idéalement : on ne rattrape une exception que si on sait quoi en faire. Halte aux rattrapages abusifs et aux messages derreur intempestifs ! Exemple: une pile déléments de capacité bornée est pleine. Lutilisateur essaie dempiler un nouvel élément. Vous faites quoi ? n En phase de mise au point : il vaut mieux ne pas rattraper les exceptions qui ne devraient pas se produire (=> facilite la mise au point grâce à la trace de propagation) n En production: on peut préférer un code plus « robuste » : on rattrape, à condition de savoir comment repartir du bon pied !

22 F. Voisin : Introduction à Java 22 Eléments méthodologiques : qui rattrape quoi ? (suite) n Il est courant de rattraper une exception pour en lever une autre à la place (éventuellement après un traitement local) public RendezVous(RnDate d, int q, String s, Person p) throws ErreurRendezVous { if (q < 1) throw new ErreurRendezVous ("erreurDurée"); try { this.deb = d; this.raison = s, this.qui = p; this.fin = new RnDate(d.annee(), d.quantieme() + q); // OK ? } catch (ErreurDate e) { p.prevenir("pas pendant le reveillon"); throw new ErreurRendezVous ("erreurAnnée"); } Il reste des éléments de choix : une ou plusieurs exception pour les rendez-vous ? Quel rapport hiérarchique entre les exceptions des rendez-vous, intervalles et dates ?

23 F. Voisin : Introduction à Java 23 Eléments méthodologiques (fin) Quest-ce quun cas exceptionnel ? Exemple: la méthode add(Object O) de linterface Collection : que se passe-t-il si on ajoute un élément ? Certaines collections admettent les doubles ( ArrayList ) Dautres collections nont jamais de doubles ( TreeSet ) n Certaines collections ont des contraintes supplémentaires TreeSet : ne traite que les éléments munis dune (même) relation dordre dautres refusent dajouter null. Dautres enfin refusent dimplémenter add (ou remove ) Toutes doivent être vues comme des sous-classes de Collection. Leurs versions de add doit se faire à profil dexception constant. Quelles exceptions prévoyez-vous ? Pour quels cas de figure ?

24 F. Voisin : Introduction à Java 24 Eléments méthodologiques : Exemple (fin) Un garde-fou à garantir : après C.add(e), si lappel de méthode sest bien passé, e doit être dans C ! Il nest pas « exceptionnel » dajouter un élément à une collection qui le contient : add renvoie true si lajout est possible et C na pas été modifiée add renvoie false si lajout est possible et C na pas été modifiée add lève une exception si lajout est impossible : UnsupportedOperationException pour celles qui nimplémentent pas add ClassCastException pour celles qui ont des contraintes « de type » IllegalArgumentException pour dautres contraintes sur les éléments Ces trois classes dexception sont classées dans RuntimeException pour ne pas avoir à être spécifiées explicitement. On peut donc jouer sur la valeur de retour et/ou sur la levée dexception !


Télécharger ppt "F. Voisin : Introduction à Java 1 Introduction à Java - les exceptions - Frédéric VOISIN FIIFO - « Remise à Niveau »"

Présentations similaires


Annonces Google