Académique Documents
Professionnel Documents
Culture Documents
Cheikh Eya
1
Programmation orientée objet Mme.Cheikh Eya
Introduction
Une exception est un événement (une erreur) qui se produit lors de l'exécution d'un
3 return (x/y);
4 }
7 c= divint(a,b);
9 }
10 }
at Div.divint(Div.java:3)
at Div.main(Div.java:7)
Une erreur s'est produite à la ligne 7 de la méthode main (la méthode divint), plus
exactement à la ligne 3 (la division de x/y) ; elle correspond à une division par zéro.
Des erreurs peuvent se produire dans d'autres circonstances, comme une ouverture
d'un fichier inexistant, l'index d'un tableau qui déborde etc.
gestion de l'erreur, il fallait prévoir un traitement adéquat pour contrer la division par
2
Programmation orientée objet Mme.Cheikh Eya
zéro.
Exemple
if (y!=0)
return(x/y);
else
// traitement de l'erreur
Le traitement de l'erreur pourrait consister à retourner une valeur: -1 pour une division
par zéro, -2 pour un index qui déborde etc. Ce traitement devient fastidieux à la
longue.
traitement A
if (!traitement_A)
méthodes de correction
else
traitement_B
if (!traitement_B)
méthodes de correction
else
etc….
Le langage Java offre un mécanisme très souple pour la gestion des erreurs. Ce
mécanisme permet d'isoler d'une part la partie du code générant l'erreur du reste du
cette erreur. Par ailleurs, le langage Java utilise des objets pour représenter les erreurs
3
Programmation orientée objet Mme.Cheikh Eya
La gestion des erreurs consiste donc à définir le bloc pouvant provoquer l'erreur (le
bloc try), ainsi ce bloc devient isolé du reste du programme ; à lancer (throw) ou
attraper (catch) les "objets" représentant les exceptions générées.
Exemple
return (x/y);}
int c=0,a=1,b=0;
}catch (ArithmeticException e) {
La classe Throwable a un attribut message de type String qui est utilisé pour stocker
le message décrivant l'exception. Ce message peut être récupéré par la méthode
getMessage().
4
Programmation orientée objet Mme.Cheikh Eya
RuntimeException :
o ArithmeticException: ex. division entière par zéro.
o NullPointerException: tentative de déréférencement sur une
variable objet dont la valeur est null.
o ClassCastException: transtypage impossible au run-time.
o ArrayIndexOutOfBoundsException: dans un tableau tentative
d’accès à un index qui n’existe pas.
o ……..
5
Programmation orientée objet Mme.Cheikh Eya
L'exception peut-être attrapée par un bloc catch (s'il existe un try) se trouvant dans
cette méthode. Si l'exception n'a pas été capturée, le traitement de cette exception
remonte vers la méthode appelante, jusqu'à être attrapée ou bien on est arrivé à la fin
du programme (ici nous nous trouvons au niveau de la méthode main).
Pour pouvoir capturer (attraper, intercepter) une exception, il faut placer le code
susceptible de la lancer dans un bloc précédé de l'instruction try. L'exception lancée
dans le bloc peut être attrapée par la méthode catch prenant pour paramètre un objet
du type de l'exception lancée.
Syntaxe :
try
{//bloc try
<suite d’instructions1>
{//clause catch
<suite d’instructions2> }
6
Programmation orientée objet Mme.Cheikh Eya
Le bloc “try” désigne le code dans lequel on suspecte qu’une exception pourrait
être levée.
- Si une exception est levée durant l’exécution du bloc “try”, le bloc “catch” est
- Si aucune exception n’est levée durant l’exécution du bloc “try”, alors le bloc
Remarque
Aucune ligne de code ne doit se trouver entre le bloc try et le bloc catch
try {
bloc_1
} catch(type_exception_1 arg_1) {
bloc_2
} catch(type_exception_2 arg_2) {
bloc_3
}...}
Exemple
class Tableau {
int i=0;
String s,choix;
7
Programmation orientée objet Mme.Cheikh Eya
try{
do
{System.out.println("donnez un entier:");
s = ligne.readLine();
tab[i]= Integer.parseInt(s);
choix=ligne.readLine();
i++;
}while(choix.equals("oui"));
System.out.println(exc.toString());
System.out.println("erreur de lecture"+io.getMessage() );
for(i=0;i< tab.length;i++)
System.out.print(tab[i]+"\t");
Remarque
Si on a plusieurs blocs catch, on doit faire attention à l'ordre dans lequel on les
écrit si les exceptions qu’on traite sont dérivées les unes des autres. D’une
manière général l’ordre des blocs catch doit respecter l’ordre inverse de l’ordre
d’héritage entre les classes d’exception.
8
Programmation orientée objet Mme.Cheikh Eya
Exception try{
….
Except2
} catch(Except2 e2){
….
} catch(Except1 e1){
Except3
….}
Les blocs catch reçoivent une instance de l'objet Exception contenant une courte
explication du problème. La méthode getMessage() retourne cette information.
Parfois, lorsque la description d'une erreur n'est pas claire, on peut essayer la
méthode toString() à la place :
catch(Exception exception) {
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é:
exception, return, déroutement étiqueté, ... (sauf si on invoque System.exit(...)).
Exemple
package ExemplesCours;
class Ex3 {
public static void main(String[] args) {
int n=0;
try {
String x=args[0]; //génère une exception, si on ne donne pas d'arguments
System.out.println("donnee: "+ x);
9
Programmation orientée objet Mme.Cheikh Eya
n=2*Integer.parseInt(x);
System.out.println("n="+ n);
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println(e + ":Pas d'entree.");
}catch(NumberFormatException e) {
System.out.println(e + "n'a pas pu etre analysee.");
} finally {
System.out.println("n="+n);}
}
}
Remarques :
- permet d'effectuer des traitements après le bloc try, même si une exception a été levée
et non attrapée par les blocs catch.
- Si aucune exception n'a été levée, finally est exécutée quand même après la fin du
bloc try.
- Si le bloc finally se termine par un return, c'est cette valeur qui sera retournée, peu
importe ce qu'il s'est passé dans les blocs try et catch (par exemple, s'il y avait aussi
une instruction return dans un bloc try et/ou catch, elle sera ignorée dans ce cas). S'il
y a une instruction return que dans le bloc try, finally est quand même exécutée
avant que ce "return" soit pris en compte.
- Si dans un bloc try, il y a une commande break, finally sera toujours exécutée, par la
suite ca sera le tour des instructions après le bloc finally d'être exécutées.
Si aucun bloc catch ne peut capturer cette exception, la main est donnée à la méthode
appelante. À elle de voir si elle peut traiter cette exception, sinon on remonte de
méthode en méthode à la recherche d'un bloc catch adéquat, jusqu'à terminer le
programme (donc niveau main).
10
Programmation orientée objet Mme.Cheikh Eya
package ExemplesCours;
class Ex4 {
return (x/y);
int c=0,a=1,b=0;
try {
c= divint(a,b);
}catch (ArithmeticException e) {
System.exit(0);
}}
pas localement, cette méthode doit mentionner son type dans son en-tête en utilisant
pour cela, le mot réservé throws.
11
Programmation orientée objet Mme.Cheikh Eya
Exemple
package ExemplesCours;
class Ex5 {
return (x/y);
int z=0;
z=divint(x,y);
return z;
int c=0,a=1,b=0;
try {
c= madivision(a,b);
}catch (ArithmeticException e) {
System.exit(0);}}
12
Programmation orientée objet Mme.Cheikh Eya
Exemple
package ExemplesCours;
MaArithmeticException(String message){
super(message);}}
class Ex6 {
return (x/y);
int c=0,a=1,b=0;
try {
c= divint(a,b);
}catch (MaArithmeticException e) {
System.out.println(e.getMessage());
System.exit(0);
}}
13