Vous êtes sur la page 1sur 30

Gestion des exceptions

 Exception
 Une exception est une erreur ou bien une action inattendue
qui peut avoir lieu au moment de la compilation ou de
l’exécution d’un programme
 Traditionnellement, en cas d'erreur, le programme
s'interrompt définitivement avec l'affichage d'un message
à l'écran décrivant l'erreur
 L'idée est alors de munir le langage Java d'un mécanisme
permettant de gérer les erreurs sans que le programme
s'arrête définitivement
 En Java, les exceptions sont représentées sous forme d’objets
 Ainsi, lors de la détection d'une exception, un objet, qui
identifie cette exception, est créé

2 Mohamed Aymen CHARRADA 27/11/2023


 Exception
 Exemple de départ :
public class Test {
public static void main (String[] args) {
int i = 3;
int j = 0;
System.out.println ("résultat1 = "+ (i / j));
System.out.println ("résultat2 = "+ (i + j));
}
}

 Dans cet exemple, l’expression « i/j » peut générer une erreur


arithmétique dans le cas où « j » est égale à 0 (ce qui est le cas)
 Il y a une erreur à l’exécution, le programme ne traite pas cette
erreur et il s’arrêtera brutalement (il va planté)
3 Mohamed Aymen CHARRADA 27/11/2023
 Exception
 Il existe deux types d’exceptions :
 Les exceptions prédéfinies : ce sont des classes fournies avec la
JDK qui traitent une panoplie d’erreurs possibles dans les
programmes Java
Throwable Object

Error Exception

RuntimeException IOException AWTException …


ArethmiticException EOFException

NumberFormatException ClassNotFoundException

NullPointerException … Toutes les exceptions dérivent



de la classe « Throwable »
4 Mohamed Aymen CHARRADA 27/11/2023
 Exception
 Exceptions prédéfinies (suite)
 La classe « Error » et ses descendants
 Elles représentent les erreurs graves intervenues dans la machine
virtuelle Java
 Exemple :
o OutOfMemoryError : déclenchée lorsqu'il n'y a plus de
mémoire disponible
o StackOverflowError : levée en cas de dépassement de
capacité de pile à la suite d'un trop grand nombre d'appels
récursifs …
 Elles ne sont pas gérées dans le programme

5 Mohamed Aymen CHARRADA 27/11/2023


 Exception
 Exceptions prédéfinies (suite)
 La classe Exception et ses descendants
 Elles représentent des exceptions moins graves
 Elles sont gérées dans le programme
 Les sous-classes de la classe « Exception » sont réparties en deux
catégories :
o Les exceptions d’exécution (runtime) sont souvent l’effet du
manque de robustesse du code (« NullPointerException » est levée
lorsque on manipule un objet déclaré et non instancié,
« NumberFormatException » est levée lorsque la conversion d'une
chaîne en un type numérique échoue …)
o Les autres exceptions correspondent à des événements anormaux
échappant au contrôle du programme (« IOException » est levée
suite à un problème d’entrée/sortie…)

6 Mohamed Aymen CHARRADA 27/11/2023


 Exception
 Exceptions personnalisées
 En cas de nécessité, on peut créer ses propres exceptions en créant
des nouvelles classes qui modélisent ces exceptions
 Elles doivent hériter des classes Exception ou RunTimeException
(ou de l’une de leurs sous-classes) mais pas de la classe Error
 Il est préférable (par convention) d'inclure le mot « Exception »
dans le nom de la nouvelle classe qui modélise l’exception
personnalisée

7 Mohamed Aymen CHARRADA 27/11/2023


 Exception
 En Java, les exceptions (prédéfinies ou personnalisées) sont
gérées en utilisant les clauses
 try – catch – finally
 throw
 throws

8 Mohamed Aymen CHARRADA 27/11/2023


 Les clauses « try », « catch » et « finally »
 Exemple
public class Test {
public static void main (String[] args) {
int i = 3;
Code susceptible de
int j = 0;
générer une exception
try { //Début du bloc « try »
System.out.println("résultat = " + (i/j)); Type de l’exception
possible à intercepter
} //Fin du bloc « try »
catch (ArethmeticException e){ Traitement à exécuter
System.out.println("Erreur"); lorsque l’exception est
} //Fin du bloc « catch » interceptée

}
}
9 Mohamed Aymen CHARRADA 27/11/2023
 Les clauses « try », « catch » et « finally »
 Le bloc « try - catch » assure le traitement des exceptions
 Le bloc « try » rassemble les instructions susceptibles de
produire des erreurs ou des exceptions
 Chaque bloc « try » est suivi par au moins un bloc « catch »
 S'il y a plusieurs types d'exceptions à intercepter pour un
même bloc de code, il faut définir autant de blocs « catch »
que de types d’exceptions possibles
 Si une exception survient dans le bloc « try », le reste de ce
bloc est abandonné et le contrôle est transféré au bloc « catch
» correspondant, qui capture et gère l'exception spécifiée,
permettant au programme de réagir à cette exception sans
planter

10 Mohamed Aymen CHARRADA 27/11/2023


 Les clauses « try », « catch » et « finally »
 Dans le cas du traitement de plusieurs exceptions, il faut faire
attention à l'ordre des clauses « catch » pour traiter en premier
les exceptions les plus précises (sous-classes) avant les
exceptions les plus générales

11 Mohamed Aymen CHARRADA 27/11/2023


 Les clauses « try », « catch » et « finally »
 Syntaxe
try {
instructions_risquées;

}
catch (ExceptionPrécise1 e) { traitement1; }
catch (ExceptionPrécise2 e) { traitement2; }
catch (Exception e) { traitement n; }

 Si un événement indésirable survient dans le bloc « try », le


premier bloc « catch » est traité. Si l’exception traitée dans ce
bloc ne correspond pas à la nature de l’erreur survenue, on
passera au bloc « catch » suivant et ainsi de suite jusqu’au
traitement de l’erreur
12 Mohamed Aymen CHARRADA 27/11/2023
 Les clauses « try », « catch » et « finally »
 Exemple
public class Test {
public static void main(String[] args) {
int i = 3;
int j = 0;
try {
System.out.println("résultat1 = " + (i / j));
System.out.println ("résultat2 = "+ (i + j));}
catch (Exception e) { S.o.p("Erreur générale"); }
catch (ArithmeticException e) {S.o.p("Erreur spécifique"); }
}
}
Est-ce que cet exemple est exacte ou non? Pourquoi?
Non, l’exception globale « Exception » est interceptée
avant l’exception spécifique « ArithmeticException
Mohamed Aymen CHARRADA
»
27/11/2023
13
 Les clauses « try », « catch » et « finally »
 Correction de l’exemple
public class Test {
public static void main(String[] args) {
int i = 3;
int j = 0;
try {
System.out.println("résultat1 = " + (i / j));
System.out.println("résultat2 = "+ (i + j));}
catch (ArithmeticException e) {
System.out.println("Exception arithmétique"); }
catch (Exception e) {
System.out.println("Exception générale"); }
}
}

14 Mohamed Aymen CHARRADA 27/11/2023


 Les clauses « try », « catch » et « finally »
 Plusieurs types d’exceptions peuvent être interceptés au
même temps par un seul bloc « catch » comme suit :
try {
instructions_risquées;

}
catch (Exception1 e1 | Exception2 e2 | …) {
traitement;
}

15 Mohamed Aymen CHARRADA 27/11/2023


 Les clauses « try », « catch » et « finally »
 Clause « finally »
try {
instruction_risquée1;
instruction_risquée2;

}
catch (ExceptionPrécise1 e) { traitement1; }
catch (ExceptionPrécise2 e) { traitement2; }
catch (Exception e) { traitement n; }
finally { traitement_pour_terminer_proprement; }

 La clause « finally », qui est facultative, sert à définir un


bloc de code qui sera toujours exécuté (exception levée ou
non)
16 Mohamed Aymen CHARRADA 27/11/2023
 Les clauses « try », « catch » et « finally »
 Exemple
public class Test {
public static void main(String[] args) {
int i = 3;
int j = 0;
try {
System.out.println("résultat = " + (i / j)); }
catch (ArithmeticException e) {
System.out.println("Exception arithmétique"); }
catch (Exception e) {
System.out.println("Exception générale"); }
finally { System.out.println("Terminé");}
}
}
17 Mohamed Aymen CHARRADA 27/11/2023
 Classe « Throwable »
 Cette classe hérite directement de la classe « Object » :
c'est la classe de base pour le traitement des erreurs
 Cette classe possède deux constructeurs :
 Throwable( )
 Throwable(String msg) : Le paramètre « msg » permet de
définir un message qui décrit l'exception et qui pourra être
consulté dans un bloc catch
 Les principales méthodes de la classe « Throwable » sont :
Méthode Rôle

String getMessage( ) Retour du message de l’exception


affiche l'exception et l'état de la pile d'exécution au moment
void printStackTrace( )
de son appel

18 Mohamed Aymen CHARRADA 27/11/2023


 Classe « Throwable »
 Exemple :
public class Test {
public static void main(String[] args) {
int i = 3;
int j = 0;
try {
System.out.println("résultat = " + (i / j)); }
catch (ArithmeticException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}

19 Mohamed Aymen CHARRADA 27/11/2023


 Les clauses « throw » et « throws »
 La clause « throw » est utilisé pour lancer explicitement
(déclencher) une exception dans le programme
 En fait, lorsqu'une condition particulière est rencontrée, le
programmeur peut utiliser « throw » pour lancer une
instance d'exception spécifique
public void verifAge (int age) {
if (age < 0) {
throw new IllegalArgumentException("L'âge ne peut pas être
négatif !");
}
else { On lève explicitement une
System.out.println("Age conforme"); instance de l’exception
} IllegalArgumentException
}

20 Mohamed Aymen CHARRADA 27/11/2023


 Les clauses « throw » et « throws »
 La clause « throws » est utilisée dans la signature d'une
méthode pour indiquer que cette méthode peut
potentiellement lancer certaines exceptions
public void lireAge() throws IOException {
int age; On indique au compilateur que la méthode
age = sc.nextInt(); « lireAge » est susceptible de lever une
exception de type IOException
if (age < 0) {
throw new IOException("L'âge doit être positif");
}
On lève effectivement une
else { instance de l’exception
System.out.println("Age conforme"); IOException
}
}

21 Mohamed Aymen CHARRADA 27/11/2023


 Les clauses « throw » et « throws »
 Les méthodes pouvant lever des exceptions doivent inclure
une clause « throws nom_exception » dans leur en-tête
 L'objectif est de préciser au compilateur que cette méthode
pourra lever cette exception et que toute méthode qui
l'appelle devra prendre en compte cette exception

22 Mohamed Aymen CHARRADA 27/11/2023


 Les clauses « throw » et « throws » On n’a pas utilisé la
clause throws
public void verifAge (int age) {
if (age < 0) {
throw new IllegalArgumentException("L'âge ne peut pas être
négatif !");
}
else { Car IllegalException est une
System.out.println("Age conforme"); exception non vérifiée (qui hérite
} de la classe RunTimeException)
}

 Lorsqu'une méthode est susceptible de lever une


exception vérifiée (c'est-à-dire une exception qui est
une sous-classe de Exception mais pas de
RuntimeException), elle doit utiliser la clause « throws »
pour déclarer cette exception dans sa signature. Dans le cas
contraire, cette clause est omise
23 Mohamed Aymen CHARRADA 27/11/2023
 Les clauses « throw » et « throws »
 Dans une méthode, on peut avoir du code qui peut lever
différentes exceptions vérifiées. Ainsi, la clause
« throws » peut définir une liste d’exceptions
public void fct ( ) throws Exception1, Exception2, … {

24 Mohamed Aymen CHARRADA 27/11/2023


 Exception personnalisée On définit une classe dérivée de
la classe Exception avec une
 Exemple méthode retournant un message

On indique que la méthode « verifier »


est susceptible de lever une exception de
type ChaineVideException
Résultat

On lève explicitement une


instance de l’exception

Ici la chaine passée est vide, alors


l’exception est levée dans la méthode
« main » et interceptée par le bloc
« catch »

La méthode « getMessage » de la
classe de l’exception est appelée
On dit que l’exception est traitée
25 sur
Mohamed Aymen place où elle a été interceptée
CHARRADA 27/11/2023
 Propagation des exceptions
 Chaque méthode susceptible de lever une exception
dans son corps doit assumer sa responsabilité en traitant
cette exception ou en la propageant vers la méthode
appelante
 La méthode doit alors déclarer cette propagation dans
l'en-tête de la méthode à travers la clause « throws »
4
6 5
3
methodeA () { 1 2
try{ methodeD () throws
methodeB () throws methodeC () throws
methodeB ( ); Exception1{
Exception1{ Exception1{
}catch (Exception1 e){ throw new
methodeC ( ); methodeD ( );
… Exception1;
} }
} }
}
Exception traitée dans Exception levée dans la
la méthode « A » méthode « D »
26 Mohamed Aymen CHARRADA 27/11/2023
 Exercice 1
 Etant donnée l’arborescence des classes, dites si le code
suivant est correcte ou non. Si non, proposez une
correction
try {
traitement;
}
Exception catch (BException e) {
System.out.println("Exception B"); }
AException BException catch (CException e) {
System.out.println("Exception C"); }
CException catch (AException e) {
System.out.println("Exception A"); }
catch (Exception e) {
System.out.println("Exception"); }

27 Mohamed Aymen CHARRADA 27/11/2023


 Exercice 2
 On veut écrire un programme qui permet de s’assurer du
nombre des jours en fonction du mois (Janvier 31 jours,
février 28 ou 29 jours …)
 Ecrire une classe SaisieDateException qui hérite la classe
Exception et qui définit un constructeur
«SaisieDateException (String s) » et une seule méthode «
public String message () » retournant un message d’erreur de
la date
 Ecrire une méthode «public void controlmois(int jour,int
mois) » qui vérifie la conformité du mois (entre 1 et 12) et du
nombre de jours en fonction du mois et qui lève une exception de
type SaisieDateException en cas d’erreur. Si tout va bien, elle
affichera le message « Jours et mois conformes ».
 Dans la méthode « main », testez la méthode « controlmois »
28 Mohamed Aymen CHARRADA 27/11/2023
 Exercice 3 1. Expliquez le résultat obtenu
2. Capturez l’exception dans un
bloc « try …catch… » pour
afficher un message d’erreur
3. Que sera alors la valeur de la
variable « somme » et pourquoi?
4. Utilisez la clause « throw » pour
lever vous-même une exception
lorsqu’on arrive au 2ème élément
du tableau. Cette exception doit
permettre de prendre en compte
la partie entière du 2ème élément
 Le résultat d’exécution de cette dans le calcul de la somme
classe est :

29 Mohamed Aymen CHARRADA 27/11/2023


30 Mohamed Aymen CHARRADA 27/11/2023

Vous aimerez peut-être aussi