Les Exceptions en Java
Cours de Programmation Orientée Objet Avancée ISET Bizerte CHALOUAH Anissa
Anissa CHALOUAH
1
Introduction aux exceptions
1)
2) 3)
Introduction aux exceptions
Exception : Définition Exception : Mécanisme
Anissa CHALOUAH
2
Introduction aux Exceptions
Avoir un programme qui compile bien, n’est en aucun cas une garantie d’un
programme qui fonctionne correctement.
un programme peut être rendue instable par toute une série de facteurs :
Des problèmes liés au matériel : perte subite d'une connexion à un port, un disque défectueux... Des actions imprévues de l'utilisateur, entrainant par exemple une division par zéro... Des débordements de stockage dans les structures de données...
Java prend en charge la gestion de telles erreurs qui peuvent conduire à
l’arrêt brutale de l’exécution du programme
Anissa CHALOUAH
A1
3
Diapositive 3
A1
conduire Aymen; 12/02/2017
Exception : Définition
Une exception est un signal qui
indique qu’un événement anormal (une erreur) est survenu dans un programme, interrompt le flot d'exécution du programme.
La récupération (le traitement) de l’exception permet au programme de continuer son
exécution.
Anissa CHALOUAH
4
Programme sans gestion de l'exception
---- java UseAction1 Début du programme
...Avant incident
java.lang.ArithmeticException : / by zero ---- : Exception in thread "main"
Anissa CHALOUAH
5
Diapositive 5
A1
Anissa; 29/01/2017
Gestions des exceptions : Principe
Lorsque qu’une erreur a été détectée à un endroit, on la signale en lançant (throw) un objet contenant toutes les informations que l’on souhaite donner sur l’erreur (« lancer » = créer un objet disponible pour le reste du programme)
à l’endroit où l’on souhaite gérer l’erreur, on peut attraper (catch) l’objet lancé si un objet « lancé » n’est pas attrapé du tout, cela provoque l’arrêt du programme :
toute erreur non gérée provoque l’arrêt.
Un tel mécanisme s’appelle gestion des exceptions.
Anissa CHALOUAH
6
Gestions des exceptions : Principe
Une exception est un signal déclenché par une instruction et traité par une
autre
Il faut que marquer les instructions susceptible de générer l’erreur par un try Il faut qu’un objet soit capable de signaler ou lever (throw) une exception à un
autre objet
Il faut que l’autre objet puisse saisir (catch) une exception afin de la traiter Lorsque l’exception se produit le contrôle est transféré à un gestionnaire d’exceptions:
Séparation de l’exécution normale de l’exécution en cas de condition anormale
Anissa CHALOUAH
7
Gestions des exceptions : Mécanisme(1)
Lorsqu'une exception est levée, le programme arrête son exécution et ne reprendra que dans un bloc catch()adéquat de l'exception. La méthode qui a levé l'exception va alors :
la traiter immédiatement ou va la propager à la méthode appelante qui à son tour va traiter
l'exception ou la propager.
La seule façon de stopper ce parcours sera de traiter l'exception
( catch).
Anissa CHALOUAH
8
Gestions des exceptions : Mécanisme(2)
Il faut voir ce phénomène comme des passes au rugby: l'exception est le ballon et il est transmis de joueurs en joueurs jusqu'à celui qui va 'traiter l'exception' et marquer l'essai.
Anissa CHALOUAH
9
Anissa CHALOUAH
10
Gestions des exceptions : Avantages
Les exceptions permettent :
de transférer le flot de contrôle de l'instruction qui lève l'exception (qui detecte
l'anomalie) vers la partie du programme capable de la traiter ;
d‘éviter de surcharger le code d'une méthode avec de nombreux tests
concernant ces cas anormaux ;
de regrouper le traitement des cas anormaux et erreurs ; de classifier les anomalies (différents types d'exceptions).
Anissa CHALOUAH
11
Hiérarchie des exceptions
Anissa CHALOUAH
12
Hiérarchie des exceptions
Exceptions sous contrôles (Vérifiées)
Exceptions hors contrôles (Non vérifiées)
Anissa CHALOUAH
Publicité
13
La classe throwable
Cette classe descend directement de la classe Object. La classe Throwableest la classe mère de toutes les exceptions et erreurs : seules des instances de Throwableou de ses classes dérivées peuvent être levée par l’instruction throwou être argument d’un catch.
La classe Throwablea un constructeur par défaut et un constructeur qui a en argument
une chaîne de caractères : le « message » de l’exception.
Throwable()
Throwable(String message)
Le constructeur par défaut. Le constructeur avec un paramètre, le message de l'exception.
Anissa CHALOUAH
14
La classe throwable (2)
Les principales méthodes de la classe Throwable sont :
Méthodes
Rôle
String getMessage( )
void printStackTrace( )
String toString()
lecture du message affiche l'exception et l'état de la pile d'exécution au moment de son appel
Anissa CHALOUAH
15
Exceptions hors contrôle (Unchecked exceptions) classes dérivées de java.lang.Error :
ce sont des erreurs qui ne peuvent pas être récupérées (plus de mémoire, classe
non trouvée etc.) ;
Vous n'avez pas à traiter les instances de la classe Error
classes dérivées de java.lang.RuntimeException :
ce sont des erreurs de programmation, elles ne devraient pas se
produire(NullPointerException, IndexOutOfBoundsException).
Les exceptions hors contrôle n’ont pas besoin d’être spécifié dans la déclaration d’une méthode (throws)
Anissa CHALOUAH
16
Unchecked Exceptions : RuntimeException exemples
ArithmeticException (e.g., bad computation such as divide by 0) ArrayStoreException (e.g., storing wrong type of object in array) ClassCastException (e.g., cannot typecast one class to another) IndexOutOfBoundsException (e.g., gone outside array bounds) NoSuchElementException (e.g., cannot find any more elements) NullPointerException (e.g., attempt to send message to null) NumberFormatException (e.g., trouble converting to a number)
Anissa CHALOUAH
17
Exceptions sous contrôle (checked exceptions) Ce sont les classes dérivées de Exception (mais pas de RuntimeException). Elles peuvent (doivent !) être récupérées et traitées. Elles correspondent a la notion de robustesse.
Si on écrit une méthode qui lève une exception contrôlée, on doit utiliser une clause throws afin de déclarer l'exception au sein de la signature de la méthode.
Anissa CHALOUAH
18
Checked Exceptions : Exemples
ClassNotFoundException (e.g., tried to load an undefined class) CloneNotSupportedException (e.g., cannot make copy of object) DataFormatException (e.g., bad data conversion) IllegalAccessException (e.g., access modifiers prevent access) InstantiationException (e.g., problem creating an object) IOException
EOFException (e.g., end of file exception) FileNotFoundException (e.g., cannot find a specified file)
Anissa CHALOUAH
19
Gestions des Exceptions
Anissa CHALOUAH
20
Traitement d’une exception : mots clés
On utilise trois types de blocs d'instructions : try { … } : permet de spécifier une section de code sur laquelle on s'attend qu'une
exception (une erreur) soit levée.
catch(exception e) { … } :
sert à spécifier le code à exécuter si une exception du type
de celle passée en argument se produit. On peut avoir plusieurs blocs catch à la suite d’un bloc try si nécessaire.
finally { … } :
introduit un code de traitement d'exception, qui sera toujours exécuté
qu’une exception est été levé ou non. Ce bloc est facultatif.
Anissa CHALOUAH
21
Traitement d’une exception : syntaxe
try {
/* <lignes de code à protéger> */
}catch ( UneException E ) {
/* <lignes de code réagissant à l’exception UneException > */
}
Le type UneException est obligatoirement une classe qui hérite de la classe Exception.
Anissa CHALOUAH
22
Traitement d’une exception : Exemple
---- java UseAction1 Début du programme. ...Avant incident Interception exception Fin du programme. ---- : operation complete.
Anissa CHALOUAH
23
Le bloc finally
les clauses catch sont suivies de manière optionnelle par un bloc finally qui contient du code qui sera exécuté quelle que soit la manière dont le bloc try a été quitté.
le bloc finally permet de spécifier du code dont l'exécution est garantie
quoi qu'il arrive (qu’une exception ait été lancée ou pas par le bloc try)
But: faire le ménage (fermer des fichiers, des connexions, etc..)
Anissa CHALOUAH
24
Le bloc finally : Syntaxe
try {
<code à protéger>
} catch (exception1 e ) {
<traitement de l'exception1>}
catch (exception2 e ) {
<traitement de l'exception2>}
... finally {
<action toujours effectuée>
Publicité
}
Anissa CHALOUAH
25
Exceptions multiples
1)
Interceptions de plusieurs exceptions
2) Ordre d’exécution de plusieurs exceptions hiérarchisées
Anissa CHALOUAH
26
Interceptions de plusieurs exceptions
Dans un gestionnaire try...catch, il est en fait possible d'intercepter plusieurs types
d'exceptions différentes et de les traiter.
la syntaxe d'un tel gestionnaire fonctionne comme un sélecteur ordonné, ce qui signifie
qu'une seule clause d'interception est exécutée.
Lorsqu’une erreur survient dans le bloc try, la suite des instructions du bloc est abandonnée les clauses catch sont testés séquentiellement le premier bloc catch correspondant à l’erreur est exécuté.
Anissa CHALOUAH
27
Interceptions de plusieurs exceptions : Syntaxe
try {
< bloc de code à protéger>
} catch ( TypeException1 E ) { <Traitement TypeException1 > } catch ( TypeException2 E ) { <Traitement TypeException2 > } ..... catch ( TypeExceptionk E ) { <Traitement TypeExceptionk > }
• Où TypeException1, TypeException12, ... , TypeExceptionk sont des classes d'exceptions obligatoirement
toutes distinctes.
• Seule une seule clause catch ( TypeException E ) {...}est exécutée (celle qui correspond au bon type de
l'objet d'exception instancié).
Anissa CHALOUAH
28
Interceptions de plusieurs exceptions : Exemple (1)
Anissa CHALOUAH
29
Interceptions de plusieurs exceptions : Exemple (2)
Anissa CHALOUAH
30
Interceptions de plusieurs exceptions : Exemple (3)
Anissa CHALOUAH
31
Ordre d'interception d'exceptions hiérarchisées
l’ordre des blocs catch doit se faire de l’erreur la plus spécifique à la plus générale !
On choisira donc, lorsqu’il y a une hiérarchie entre les exceptions à
intercepter, de placer le code de leurs gestionnaires dans l’ordre inverse de la hiérarchie.
Anissa CHALOUAH
32
Ordre d'interception d'exceptions hiérarchisées : exemple
Soit une hiérarchie d'exceptions dans java
java.lang.Exception | +--java.lang.RuntimeException
| +--java.lang.ArithmeticException | +--java.lang.ArrayStoreException | +--java.lang.ClassCastException
Anissa CHALOUAH
33
Ordre d'interception d'exceptions hiérarchisées : exemple
Résultats de l'exécution : ---- java UseAction2
UseAction2.java:19: exception java.lang.ArithmeticException has already been caught
catch(ArithmeticException E){ ^
UseAction2.java:22: exception java.lang.ArrayStoreException has already been caught
catch(ArrayStoreException E){ ^
UseAction2.java:25: exception java.lang.ClassCastException has already been caught
catch(ClassCastException E){ ^
3 errors
Le compilateur proteste à partir de la clause catch ( ArithmeticException E )en nous indiquant que l'exception est déjà interceptée et ceci trois fois de suite.
Anissa CHALOUAH
34
Ordre d'interception d'exceptions hiérarchisées : exemple
Anissa CHALOUAH
35
Throw, throws
Anissa CHALOUAH
36
Lever une exception (throw)
La Java machine peut déclencher une exception automatiquement comme dans l'exemple de la levée d'une ArithmeticException lors de l'exécution de l'instruction "x = 1/0 ;".
La Java machine peut aussi lever (déclencher) une exception à votre
demande suite à la rencontre d'une instruction throw.
Anissa CHALOUAH
37
Lever une exception (throw)
L’opérateur throw permet de lever une exception
if (<condition anormale>) { throw new TypeException(<parametres effectifs>); }
Anissa CHALOUAH
38
Lever une exception (throw) : Exemple
Résultats de l'exécution : ---- java UseAction3 Début du programme.
...Avant incident
Interception exception : Mauvais calcul ! Fin du programme. ---- : operation complete.
Anissa CHALOUAH
39
Propagation d’une exception (throws)
Lorsque les méthodes utilisées génèrent des exceptions, autres que des
RuntimeException, on a le devoir de capter ces exceptions.
Publicité
Mais parfois il n'est pas possible ou pas souhaité de traiter l'exception
immédiatement.
Dans ce cas on doit déclarer celle-ci en utilisant le mot-clé throws dans l'en-tête
de la méthode susceptible de générer l'exception en question.
On propage alors l'exception à la méthode appelante, c'est à dire à la méthode qui
fait appel à la méthode à partir de laquelle l'exception est générée.
Anissa CHALOUAH
40
Propagation d’une exception (throws)
Si une méthode est susceptible de lever une exception qu’on ne veut pas gérer au sein de la méthode, elle se doit de prévenir les appelants avec le mot clé throws.
Anissa CHALOUAH
41
Spécification d’une exception : Syntaxe
<modifieurs> Type maMethode(<parametres>) throws TypeExc1, TypeExc2, ...
Exemple
protected static void meth ( int x, char c )
throws IOException, ArithmeticException {
.....
}
Anissa CHALOUAH
42
Spécification d’une exception : Exemple
Résultats de l'exécution : ---- java UseAction4 UseAction4.java:8: unreported exception java.io.IOException; must be caught or declared to be thrown
throw new IOException("Problème d'E/S !"); ^
1 error
Anissa CHALOUAH
43
Spécification d’une exception : Exemple
Résultats de l'exécution : ---- java UseAction4 Début du programme.
...Avant incident
Interception exception : Problème d'E/S ! Fin du programme.
Anissa CHALOUAH
44
Exceptions personnalisées
Anissa CHALOUAH
45
Il est possible de créer dans vos applications vos propres classes
d'exception.
La nouvelle classe d'exception créée doit obligatoirement hériter de la
classe Exception de Java ou d'une de ses sous-classes plus spécifiques.
class MaClasseException extends Exception{
}
Anissa CHALOUAH
46
La structure de votre nouvelle classe d'exception doit au moins posséder un des deux
constructeurs:
• un sans paramètre • un avec un paramètre de type String correspondant au message associé à l'erreur générée.
class MaClasseException extends Exception{
MaClasseException(){
super();
}
MaClasseException(String monMessage){
super(monMessage);
}
}
Anissa CHALOUAH
Le constructeur prenant un objet de type String en paramètre permet de specier un message pour l'exception. Ce message est récupérable par getMessage().
47
Les méthodes de la classe Exception seront également disponibles pour votre nouvelle
classe. Vous pourrez donc:
afficher la valeur du message éventuellement transmis en paramètre au constructeur de la classe
grâce à la méthode getMessage()
afficher, sur la sortie d'erreur, la liste des appels ayant conduit à la génération de l'exception
grâce à la méthode printStackTrace()
Anissa CHALOUAH
48
Lever une exception personnalisée
Pour une exception personnalisée, le mode d'action est strictement identique Il faut spécifier les exceptions propagées dans la signature de la méthode (throws) Les exceptions sont levées ou envoyées par le mot-clé throw.
maMethode throws MaClasseException {
if (condition_particuliere)
throw new MaClasseException("Message d'erreur");
}
Anissa CHALOUAH
49
l
e p m e x E
:
e é s
i l
a n n o s r e p
n o i t p e c x E
Anissa CHALOUAH
50