Vous êtes sur la page 1sur 13

Programmation orientée objet Mme.

Cheikh Eya

Chapitre 7 : Les exceptions

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

programme, et qui va provoquer un fonctionnement anormal de ce dernier.

Dans le programme suivant vu que la variable b est égale à zéro, le programme va


générer une erreur lors de l’exécution, car une division par zéro vient d'avoir lieu.

1 public class Ex1 {

2 public static int divint (int x, int y) {

3 return (x/y);

4 }

5 public static void main (String [] args) {

6 int c=0, a=1, b=0;

7 c= divint(a,b);

8 System.out.println("res: " + c);

9 }

10 }

Le système affiche l'erreur suivante :

Exception in thread "main" java.lang.ArithmeticException: / by zero

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.

I. La gestion des exceptions


La gestion des exceptions se substitue en quelque sorte à l'algorithmique permettant
la gestion des erreurs. Dans l'exemple précédent, si nous avons voulu anticiper sur la

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

programme, et d'autre part de dissocier les opérations de détection et de traitement de

cette erreur. Par ailleurs, le langage Java utilise des objets pour représenter les erreurs

(exceptions) et l'héritage pour hiérarchiser les différents types d'exception.

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

public class Ex2 {

public static int divint (int x, int y) {

return (x/y);}

public static void main (String [] args) {

int c=0,a=1,b=0;

try {c= divint(a,b);

}catch (ArithmeticException e) {

System.out.println("Erreur a été capturée");}

System.out.println("res: " + c); }}

II. La hiérarchie des exceptions


Une exception Java est une instance de l’une des sous-classes de la classe Throwable.

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().

La liste des exceptions possibles est fournie dans le schéma suivant :

4
Programmation orientée objet Mme.Cheikh Eya

2.1 Exceptions checked et exceptions uncheked

On peut distinguer deux types d’exceptions :

 Les exceptions contrôlées ou vérifiées (checked exceptions) : une exception


contrôlée est vérifié par le compilateur avant l’exécution du programme. Ces
exceptions doivent impérativement être récupérées et traitées.
 Les exceptions non contrôlées ou non vérifiées (unchecked expceptions), il
s’agit d’instance des classes Error et RuntimeException (indique un problème
d’exécution souvent imprévisible par le compilateur et peut être évité en
améliorant le code).

Exemples d’exceptions non contrôlées ou non vérifiées

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

Exemples d’exceptions contrôlées

o ClassNotFoundException: au run-time la demande de chargement dynamique


d’une classe échoue.
o InterruptedException: interruption d’un Thread
o java.io.FileNotFoundException: fichier non trouvé
o java.net.MalformedURLException: erreur dans la syntaxe de description
d’une U.R.L.
o ……….

III. Mécanisme du traitement d'exception


Lorsqu'une exception est levée dans une méthode donnée, les instructions qui suivent
le lancement de l'exception, se trouvant dans cette méthode, sont ignorées.

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).

4.1 Une exception est attrapée

 Un seul bloc catch


Un bloc try est défini et contient quelques instructions qui risqueraient de lever une
ou plusieurs exceptions.

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>

} catch (Execption exception)

{//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

exécuté et désigne le comportement à suivre.

- Si aucune exception n’est levée durant l’exécution du bloc “try”, alors le bloc

“catch” n’est jamais exécuté.

Remarque

Aucune ligne de code ne doit se trouver entre le bloc try et le bloc catch

 Plusieurs blocs catch


Après un bloc try, on peut mettre plusieurs blocs catch. Chaque bloc catch gérant une
exception particulière ou un ensemble d’exceptions représentées par un ancêtre
commun (l’ordre des blocs est important en cas de recouvrement des types
d’exceptions).

try {

bloc_1
} catch(type_exception_1 arg_1) {

bloc_2
} catch(type_exception_2 arg_2) {

bloc_3
}...}
Exemple

class Tableau {

public static void main(String[] args) {

int tab[] = new int[3];

int i=0;

String s,choix;

BufferedReader ligne = new BufferedReader(new InputStreamReader(System.in));

7
Programmation orientée objet Mme.Cheikh Eya

try{

do

{System.out.println("donnez un entier:");

s = ligne.readLine();

tab[i]= Integer.parseInt(s);

System.out.print("Tapez -oui- si vous voulez donner un autre entier");

choix=ligne.readLine();

i++;

}while(choix.equals("oui"));

}catch (ArrayIndexOutOfBoundsException e){

System.out.println("Impossible d'inserer ce dernier élément : dépassement


d'indices"+e.getMessage());

}catch (NumberFormatException exc){

System.out.println(exc.toString());

}catch (IOException io){

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{

//code pouvant lever des exceptions de


//type Except1 ou Except2 ou Except3
Except1
}catch(Except3 e3){

….
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) {

System.out.println("Problème de lecture du fichier»+ exception.toString());}

 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 de rassembler dans un seul bloc un ensemble d'instructions qui autrement


auraient dû être dupliquées.

- 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.

4.2 Une exception n’est pas attrapée

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

 Exception connue par le mécanisme d'exception


Pour le faire, nous utilisons la commande throw mais il faudra faire attention que les
exceptions sont représentées par des "objets. Pour lever une exception, nous devons
créer une instance de la classe où réside cette exception.

package ExemplesCours;

class Ex4 {

public static int divint (int x, int y) {

if (y==0) throw new ArithmeticException();

return (x/y);

public static void main (String [] args) {

int c=0,a=1,b=0;

try {

c= divint(a,b);

}catch (ArithmeticException e) {

System.out.println("Erreur a été capturée");

System.out.println("res: " + c);

System.exit(0);

}}

 Exception levée plusieurs fois


Si nous avons affaire à une méthode susceptible de lever une exception qu'elle ne traite

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 {

public static int divint (int x, int y) throws ArithmeticException {

if (y==0) throw new ArithmeticException();

return (x/y);

public static int madivision(int x, int y) throws ArithmeticException {

int z=0;

z=divint(x,y);

return z;

static void main (String [] args) {

int c=0,a=1,b=0;

try {

c= madivision(a,b);

}catch (ArithmeticException e) {

System.out.println("Erreur a été capturée dans main");

System.out.println("res: " + c);

System.exit(0);}}

 Exception définies par le programmeur


Il faut savoir que toutes les nouvelles exceptions introduites par le programmeur
dérivent de la classe Exception. Donc on peut transmettre de l'information au
gestionnaire d'exception soit par l'objet ayant levé l'exception via throw, sinon par le
constructeur de la classe Exception.

12
Programmation orientée objet Mme.Cheikh Eya

Exemple

package ExemplesCours;

class MaArithmeticException extends Exception {

MaArithmeticException(String message){

super(message);}}

class Ex6 {

public static int divint (int x, int y) throws MaArithmeticException {

if (y==0) throw new MaArithmeticException("Exception nouvelle");

return (x/y);

public static void main (String [] args) {

int c=0,a=1,b=0;

try {

c= divint(a,b);

}catch (MaArithmeticException e) {

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

System.out.println("res: " + c);

System.exit(0);

}}

13

Vous aimerez peut-être aussi