Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Chapitre 1 Les Exceptions

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 27

Définition

 Souvent, un programme doit traiter des situations exceptionnelles qui n'ont pas un rapport
direct avec sa tâche principale.
 Ceci oblige le programmeur à réaliser de nombreux tests avant d'écrire les instructions
utiles du programme. Cette situation a deux inconvénients majeurs :
• Le programmeur peut omettre de tester une condition ;

• Le code devient vite illisible car la partie utile est masquée par les tests.

 Java remédie à cela en introduisant un Mécanisme de gestion des exceptions .

 Grâce à ce mécanisme, on peut améliorer grandement la lisibilité du code en séparant:

o le code utile (Code métier)

o de celui qui traite des situations exceptionnelles


2
Hiérarchie des exceptions
 Java peut générer deux types d’erreurs au moment de l’exécution:
• Des erreurs produites par l’application dans des cas exceptionnels que le programmeur
devrait prévoir et traiter dans son application. Ces genres d’erreurs sont de type
Exception
• Des erreurs qui peuvent être générées au niveau de la JVM et que le programmeur ne
peut prévoir dans son application. Ce type d’erreurs sont de type Error.

3
Catégories d’exceptions

 En Java, on peut classer les exceptions en deux catégories :

 Les exceptions surveillées,

 Les exceptions non surveillées.


 Java oblige le programmeur à traiter les erreurs surveillées. Elles sont signalées par le
compilateur
 Les erreurs non surveillées peuvent être traitées ou non. Et ne sont pas signalées par le
compilateur

4
Un premier Exemple
 Considérons une application qui permet de :

 Saisir au clavier deux entiers a et b

 Faire appel à une fonction qui permet de calculer et de retourner a divisé par b.

5
Exécution
 Nous constatons que le compilateur ne signale pas le cas ou b est égal à zéro.
 Ce qui constitue un cas fatal pour l’application.
 Voyons ce qui se passe au moment de l’exécution:
Scénario 1: Le cas normal

Scénario 2: cas ou b=0

6
Un bug dans l’application
 Le cas du scénario 2 indique qu’une erreur fatale s’est produite dans l’application au moment
de l’exécution.

 Cette exception est de type ArithmeticException. Elle concerne une division par zéro
JVM
 L’origine de cette exception étant la méthode calcul dans la ligne numéro 6.
Exception
 Cette exception n’a pas été traitée dans calcul. main
Exception
 Elle remonte ensuite vers main à la ligne numéro 17 dont elle n’a pas été traitée.
calcul
 Après l’exception est signalée à la JVM.
 Quand une exception arrive à la JVM, cette dernière arrête l’exécution de l’application, ce qui
constitue un bug fatale.
 Le fait que le message « Resultat= » n’a pas été affiché, montre que l’application ne continue
pas son exécution normal après la division par zéro

7
Traiter l’exception
 Dans java, pour traiter les exceptions, on doit utiliser le bloc try catch de la manière
suivante:

Scénario 1

Scénario 2

8
Principales Méthodes d’une Exception
 Tous les types d’exceptions possèdent les méthodes suivantes :

• getMessage() : retourne le message de l’exception

o System.out.println(e.getMessage());

 Réstat affiché : / by zero

• toString() : retourne une chaîne qui contient le type de l’exception et le message de l’exception.

o System.out.println(e.toString());

 Réstat affiché : java.lang.ArithmeticException: / by zero

• printStackTrace: affiche la trace de l’exception

o e.printStackTrace();

 Réstat affiché :
java.lang.ArithmeticException: / by zero
at App1.calcul(App1.java:4)
at App1.main(App1.java:13) 9
Exemple : Générer, Lancer ou Jeter une exception surveillée de type Exception

 Considérons le cas d’un compte qui est défini par un code et un solde et sur lequel, on peut verser un
montant, retirer un montant et consulter le solde.

déléguer la responsabilité des erreurs à la


méthode appelante

Générer une exception

10
Utilisation de la classe Compte
 En faisant appel à la méthode retirer, le compilateur signale que cette dernière peut générer une
exception de type Exception .

 C’est une Exception surveillée. Elle doit être traitée par le programmeur

11
Traiter l’exception
 Deux solutions :
• Soit utiliser le bloc try catch

• Ou déclarer que cette exception est ignorée dans la méthode main et dans ce cas là,
elle remonte vers le niveau supérieur. Dans notre cas la JVM.

12
Exécution de l’exemple

Scénario 1

Scénario 2

13
Exemple : Générer une exception non surveillée de type
RuntimeException

14
Utilisation de la classe Compte
 En faisant appel à la méthode retirer, le compilateur ne signale rien

 C’est une Exception non surveillée. On n’est pas obligé de la traiter pour que le programme soit compilé

15
Personnaliser les exception métier
 L’exception générée dans la méthode retirer, dans le cas ou le solde est insuffisant est une exception
métier.
 Il est plus professionnel de créer une nouvelle Exception nommée SoldeInsuffisantException
de la manière suivante :

 En héritant de la classe Exception, nous créons une exception surveillée.

 Pour créer une exception non surveillée, vous pouvez hériter de la classe RuntimeException

16
Utiliser cette nouvelle exception métier

17
Application
Scénario 1

Scénario 2

Scénario 3

18
Améliorer l’application
 Dans le scénario 3, nous découvrons qu’une autre exception non surveillée est
générée dans le cas ou on a saisi une chaîne de caractères et non pas un nombre.
 Cette exception est de type InputMismatchException, générée par la méthode
nextFloat() de la classe Scanner.

 Nous devrions donc faire plusieurs catch dans la méthode main

19
Application

 les clauses catch d'un bloc try sont traitées les


une après les autres dans l'ordre de leur
déclaration.

 La première clause catch qui est compatible avec


le type de l'exception est exécuté et le
programme continue son exécution après la
dernière clause catch du bloc try.

 lorsqu’il y a une hiérarchie entre les exceptions à


intercepter, Il faut donc déclarer les clauses
catch de la plus spécifique à la plus générale
(ordre inverse de la hiérarchie des exceptions)

20
Un autre cas exceptionnel dans la méthode retirer

 Supposons que l’on ne doit pas accepter un montant négatif dans la méthode retirer.

 On devrait générer une exception de type MontantNegatifException.

 Il faut d’abord créer cette nouvelle exception métier.

21
Le cas MontantNegatifEception
 L’exception métier MontantNegatifException

 La méthode retirer de la classe Compte

22
Application : Contenu de la méthode main

Scénario 1 Scénario 2

Scénario 3 Scénario 4

23
Le bloc finally
 La syntaxe complète du bloc try est la suivante :
try {
System.out.println("Traitement Normale");
}
catch (SoldeInsuffisantException e) {
System.out.println("Premier cas Exceptionnel");
}
catch (NegativeArraySizeException e) {
System.out.println("dexuième cas Exceptionnel");
}
finally{
System.out.println("Traitement par défaut!");
}
System.out.println("Suite du programme!");

 Le bloc finally s’exécute quelque soit les différents scénarios.

24
Exemple
Qu’affiche le code suivant :
public static void main (String[] args)
{
try
{
System.out.print ("A");
int value = Integer.parseInt ("8Z");
System.out.print ("B");
}
catch (NumberFormatException exception)
{System.out.print ("C");}
finally
{System.out.print ("D");}
System.out.print ("E");
}

L’exception NumberFormatException est déclenchée s’il y a une tentative de convertir une chaine à l'un des
types numériques, mais que la chaîne n'a pas le format approprié.
25
Exemple
Qu’affiche le code suivant :
public static void main (String[] args)
{
try
{
System.out.print ("A");
int value = Integer.parseInt ("8Z");
System.out.print ("B");
}
catch (NumberFormatException exception)
ACDE
{System.out.print ("C");}
finally
{System.out.print ("D");}
System.out.print ("E");
}

L’exception NumberFormatException est déclenchée s’il y a une tentative de convertir une chaine à l'un des
types numériques, mais que la chaîne n'a pas le format approprié.
26
Exercice
Définir une classe Pile qui implémente une pile d’objets avec un tableau de taille fixe. Cette classe contient les
champs suivants :
 static final int DIM = 10;
 Object [] tab;//Tableau représentant la pile
 int nbElem;//Nombre d’éléments contenus dans la pile

1. Définir un constructeur sans argument permettant de créer le tableau tab de taille dim
2. Ecrire une méthode void empiler (Object o) qui ajoute un nouvel objet o à la pile
3. Ecrire une méthode Object depiler() qui supprime le sommet de la pile.
4. Créer une exception personnalisée nommée PilePleineException. Cette exception sera levée dans
le cas où la pile est pleine.
5. Créer une exception personnalisée nommée PileVideException. Cette exception sera levée dans le
cas où la pile est vide.
6. Modifier la méthode empiler pour qu’elle génère une exception PilePleineException.
7. Modifier la méthode depiler pour qu’elle génère une exception PileVideException.
8. Ecrire une méthode main permettant de:
a. Empiler les arguments de la ligne de commande
b. Afficher les objets empilés dans l’ordre inverse.

27

Vous aimerez peut-être aussi