Bloc finally

Bloc finally

Quels résultats fournit ce programme ? class Except extends Exception {} public class Finally { public static void f(int n) { try { if (n!=1) throw new Except () ; } 97 geneli~1.book Page 137 Lundi, 10. juillet 2006 12:46 12 Les exceptions Chapitre 8 138 © Éditions Eyrolles Les instructions d’un floc finally associé à un bloc try sont toujours exécutées qu’il y ait eu ou non déclenchement d’une exception (sauf si le gestionnaire met fin à l’exécution). Ceci s’applique notamment au cas où un gestionnaire comporte une instruction return : le bloc finally est quand même exécuté auparavant. En définitive, le programme fournit ceci : dans finally – n = 1 catch dans f – n = 2 dans finally – n = 2 Redéclenchement et finally catch (Except e) { System.out.println (« catch dans f – n =  » + n) ; return ; } finally { System.out.println (« dans finally – n =  » + n) ; } } public static void main (String args[]) { f(1) ; f(2) 

Redéclenchement et finally

catch (Except e) { System.out.println (« catch dans f – n =  » + n) ; return ; } finally { System.out.println (« dans finally – n =  » + n) ; } } public static void main (String args[]) { f(1) ; f(2) ; } } Quels résultats fournit ce programme ? class Except extends Exception {} public class FinReth { public static void f(int n) throws Except { try { if (n!=1) throw new Except () ; } catch (Except e) { System.out.println (« catch dans f – n =  » + n) ; throw e ; } finally { System.out.println (« dans finally de f – n =  » + n) ; } } 98 geneli~1.book Page 138 Lundi, 10. juillet 2006 12:46 12 © Éditions Eyrolles 139 Exercice 99 Synthèse : entiers naturels La boucle for de la méthode main effectue théoriquement cinq appels de f. Le premier (n=1) ne provoque aucune exception dans f, et il conduit à l’exécution du bloc finally associé au bloc try de f. Le deuxième (n=2) provoque une exception dans f qui est traitée par le bloc catch correspondant, lequel relance à nouveau une exception ; avant qu’on ne lui cherche un gestionnaire, on exécute le bloc finally associé au bloc try. Puis on cherche un gestionnaire approprié dans un bloc try englobant, c’est-à-dire ici celui du main. On exécute donc le bloc catch correspondant, puis le bloc finally associé. Comme cette exception met fin à l’exécution du bloc try de main, le programme s’interrompt. En définitive, on obtient ces résultats : dans finally de f – n = 1 catch dans f – n = 2 dans finally de f – n = 2 catch dans main – n = 2 dans finally de main – n = 2 Synthèse : entiers naturels public static void main (String args[]) { int n=0 ; try { for (n=1 ; n<5 ; n++) f(n) ; } catch (Except e) { System.out.println (« catch dans main – n =  » + n) ; } finally { System.out.println (« dans finally de main – n =  » + n) ; } } } Réaliser une classe permettant de manipuler des entiers naturels (positifs ou nuls) et disposant : • d’un constructeur à un argument de type int ; il générera une exception ErrConst si la valeur de son argument est négative ; • de méthodes statiques de somme, de différence et de produit de deux naturels ; elles généreront respectivement des exceptions ErrSom, ErrDiff et ErrProd lorsque le résultat ne sera pas représentable ; la limite des valeurs des naturels sera fixée à la plus grande valeur du type int ; 99 geneli~1.book Page 139 Lundi, 10. juillet 2006 12:46 12 Les exceptions Chapitre 8 140 © Éditions Eyrolles L’énoncé nous impose de respecter une certaine hiérarchie pour les classes exception. Ici, pour faciliter la tâche, nous prévoyons une classe intermédiaire supplémentaire nommée ErrOp qui servira de base aux exceptions liées à des opérations arithmétiques (somme, différence ou produit) ; elle possèdera tout naturellement deux champs de type int (on aurait pu choisir aussi EntNat) représentant les valeurs des deux opérandes de l’opération. La hiérarchie des classes d’exception se présentera donc ainsi : Exception ErrNat ErrConst ErrOp ErrSom ErrDif ErrProd Voici la définition de notre classe EntNat et des classes exception correspondantes : class EntNat { public EntNat (int n) throws ErrConst { if (n<0) throw new ErrConst(n) ; this.n = n ; } public static EntNat somme (EntNat n1, EntNat n2) throws ErrSom, ErrConst { int op1 = n1.n, op2 = n2.n ; long s = op1 + op2 ; if (s > Integer.MAX_VALUE) throw new ErrSom (op1, op2) ; return new EntNat (op1+op2) ; } public static EntNat diff (EntNat n1, EntNat n2) throws ErrDiff, ErrConst { int op1 = n1.n, op2 = n2.n ; int d = op1 – op2 ; if (d<0) throw new ErrDiff(op1, op2) ; EntNat res = new EntNat (d) ; return res ; } • une méthode d’accès getN fournissant sous forme d’un int la valeur de l’entier naturel. On s’arrangera pour que toutes les classes exception dérivent d’une classe ErrNat et pour qu’elles permettent à un éventuel gestionnaire de récupérer les valeurs ayant provoqué l’exception. Écrire deux exemples d’utilisation de la classe : • l’un se contentant d’intercepter sans discernement les exceptions de type dérivé de ErrNat, • l’autre qui explicite la nature de l’exception en affichant les informations disponibles. Les deux exemples pourront figurer dans deux blocs try d’un même programme.

Formation et coursTélécharger le document complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *