Exercice Java : Redéclenchement d’une exception et choix du gestionnaire

Exercice java traite le  sujet suivant:

Redéclenchement d’une exception et choix du gestionnaire

Dans un gestionnaire d’exception, il est possible de demander que, malgré son traitement, l’exception soit retransmise à un niveau englobant, comme si elle n’avait pas été traitée. Il suffit pour cela de la relancer en appelant à nouveau  l’instruction throw :

Examinons ce petit Exercice java:


Que fournit ce programme ?

class Erreur  extends Exception {}
class Erreur1 extends Erreur    {}
class Erreur2 extends Erreur    {}
class A
{ public A(int n) throws Erreur
{ try
{ if (n==1) throw new Erreur1() ;
if (n==2) throw new Erreur2() ;
if (n==3) throw new Erreur() ;
}
catch (Erreur1 e)
{ System.out.println ("** Exception Erreur1 dans constructeur A") ;
}
catch (Erreur e)
{ System.out.println ("** Exception Erreur dans constructeur A") ;
throw (e) ;
}
}
}
public class Redecl
{ public static void main (String args[])
{ int n ;
for (n=1 ; n<=3 ; n++)
{ try
{ A a = new A(n) ;
}
catch (Erreur1 e)
{ System.out.println ("*** Exception Erreur1 dans main") ;
}
catch (Erreur2 e)
{ System.out.println ("*** Exception Erreur2 dans main") ;
}
catch (Erreur e)
{ System.out.println ("*** Exception Erreur dans main") ;
}
System.out.println ("--------------") ;
}
System.out.println ("fin main") ;
}
}

Ici, on exécute à trois reprises le même bloc try, n prenant successivement les valeurs 1, 2 et 3.
Dans le premier cas (n=1), la construction de l’objet a déclenche une erreur Erreur1 qui se trouve traitée par le gestionnaire correspondant  (catch(Erreur1 e) du constructeur de A.
Dans le second cas (n=2), la construction de a déclenche une erreur Erreur2. Elle est alors traitée par le gestionnaire  relatif au type Erreur du constructeur de A (il s’agit du premier des gestionnaires ayant un type compatible avec  Erreur2). Mais celui-ci redéclenche à son tour une exception de même type Erreur2 ; transmise au bloc try englogant,  elle est traitée par le gestionnaire catch(Erreur2). Enfin, dans le dernier cas (n=3), la construction de a déclenche une  erreur Erreur qui se trouve traitée par le gestionnaire correspondant du constructeur de A lequel, là encore,  redéclenche à son tour une exception de même type ; transmise au bloc try englobant, elle sera traitée par le gestionnaire catch(Erreur).

En définitive, le programme fournit ces résultats :

** Exception Erreur1 dans constructeur A
-------------**
Exception Erreur dans constructeur A
***
Exception Erreur2 dans main
-------------**
Exception Erreur dans constructeur A
***
Exception Erreur dans main
-------------fin main

Remarque : Notez bien qu’ici le type de l’exception redéclenchée par le second gestionnaire du constructeur de A (instruction throw e) est identique à celui reçu en argument. Il peut varier d’un appel à un autre. Ici, il s’agit soit de Erreur2, soit de Erreur.

Leave a Reply

Your email address will not be published. Required fields are marked *


*