Chapitre 1 Les Exceptions
Chapitre 1 Les Exceptions
Chapitre 1 Les Exceptions
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.
3
Catégories d’exceptions
4
Un premier Exemple
Considérons une application qui permet de :
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
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 :
o System.out.println(e.getMessage());
• toString() : retourne une chaîne qui contient le type de l’exception et le message de l’exception.
o System.out.println(e.toString());
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.
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 :
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.
19
Application
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.
21
Le cas MontantNegatifEception
L’exception métier MontantNegatifException
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!");
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