POO ISET BEJA 2023-2024
LES EXCEPTIONS
Une exception est un événement exceptionnel risquant de compromettre le bon déroulement du
programme. Un débordement de tableau ou de pile, la lecture d’une donnée erronée ou d’une
fin de fichier prématurée constituent des exemples d’exceptions. Lors de la détection d’une
anomalie, une fonction (en C par exemple) peut essayer de la traiter directement ; elle peut aussi
fournir des informations de retour (par l’intermédiaire d’une variable) indiquant le type de
l’anomalie et laissantnau programme appelant le soin de décider de la suite à donner à cette
anomalie.
En Java, la fonction peut lancer une exception en indiquant un type d’exception. L’exception
se "propage" de retour de méthode en retour de méthode jusqu’à ce qu’une méthode la traite.
Si aucune méthode ne la prend en compte, il y a un message d’erreur d’exécution. Suite à une
exception, toutes les instructions sont ignorées, sauf les instructions chargées de capter cette
exception.
Les exceptions de type RunTimeException
Exemple1 : les débordements de tableaux (dans main)
L’exécution du programme ci-dessus provoque un message d’erreur indiquant une exception
du type ArrayIndexOutOfBoundsException, et l’arrêt du programme. Le tableau de 4 entiers
tabEnt a des indices de 0 à 3. L’accès à la valeur d’indice 5 provoque une exception non captée.
// [Link]
public class TestException1 {
public static void main (String[] args) {
int tabEnt[] = { 1, 2, 3, 4 };
// Exception de type [Link]
// non controlee par le programme; erreur d’execution
tabEnt [4] = 0; // erreur et arret
[Link] ("Fin du main"); // le message n’apparait pas
} // main
} // class TestException1
Dans le programme suivant, la même erreur d’accès à un élément est captée par le programme. Lors de
la rencontre de l’erreur, les instructions en cours sont abandonnées et un bloc de traitement (catch) de
l’exception est recherché et exécuté. Le traitement se poursuit après ce bloc sauf indication contraire du
catch (return ou arrêt par exemple). Le message "Fin du main" est écrit après interception de l’exception.
public class TestException2 {
public static void main (String[] args) {
try {
int tabEnt[] = { 1, 2, 3, 4 };
// Exception de type ArrayIndexOutOfBoundsException
DR. BALKIS BETTOUMI 1
POO ISET BEJA 2023-2024
// controlee par le programme
tabEnt [4] = 0; // Exception et suite au catch
[Link] ("Fin du try"); // non executee
} catch (Exception e) {
[Link] ("Exception : " + e); // ecrit le message
}
[Link] ("Fin du main"); // executee
}
} // class TestException2
Exemples de résultats d’exécution :
Exemple2 : les débordements de tableaux (dans une méthode)
Ci-dessous, l’instruction tabEnt[4] provoque une exception dans la méthode init-Tableau().
L’instruction qui suit n’est pas prise en compte ; l’exception n’est pas traitée dans initTableau().
Les instructions qui suivent l’appel de initTableau() dans main() (le programme appelant) sont
ignorées également. Par contre, il existe un bloc catch qui traite l’exception. Le message "Fin
de main" est lui pris en compte après le traitement de l’exception.
// [Link] Exception lancee dans initTableau,
// captee dans main()
class TestException3 {
int[] tabEnt = new int[4];
void initTableau () {
tabEnt[0] = 1; tabEnt[1] = 2;
tabEnt[2] = 3; tabEnt[3] = 4;
tabEnt[4] = 5; // l’exception se produit ici; non captee
[Link]("Fin de initTableau"); // non executee
}
void ecrireTableau () {
for (int i=0; i < [Link]; i++) {
[Link] (" " + i);
}
[Link]();
}
} // class TestException3
public class PPTestException3 {
public static void main (String[] args) {
try {
TestException3 te = new TestException3();
DR. BALKIS BETTOUMI 2
POO ISET BEJA 2023-2024
[Link](); // l’exception se produit dans initTableau
[Link](); // non executee
} catch (Exception e) { // exception captee ici
[Link] ("Exception : " + e); // executee
}
[Link] ("Fin de main"); // executee
} // main
} // class PPTestException3
Résultats d’exécution :
L’exception peut aussi être traitée dans initTableau() comme indiqué ci-dessous. Le programme
se poursuit normalement une fois le bloc catch exécuté (retour de initTableau(), appel de
ecrireTableau() et message de fin).
// [Link] Exception lancee par initTableau()
// captee par initTableau()
class TestException4 {
int[] tabEnt = new int[4];
void initTableau () {
try {
tabEnt[0] = 1; tabEnt[1] = 2;
tabEnt[2] = 3; tabEnt[3] = 4;
tabEnt[4] = 5; // l’exception se produit ici
} catch (Exception e) { // captee ici
[Link] ("Exception : " + e); // ecrit le message
}
[Link]("Fin de initTableau"); // executee
}
void ecrireTableau () {
for (int i=0; i < [Link]; i++) {
[Link] (" " + tabEnt[i]);
}
[Link]();
}
} // class TestException4
public class PPTestException4 {
public static void main (String[] args) {
DR. BALKIS BETTOUMI 3
POO ISET BEJA 2023-2024
TestException4 te = new TestException4();
[Link](); // l’exception a ete captee
[Link](); // executee
[Link] ("Fin de main"); // executee
} // main
} // class PPTestException4
Exemples de résultats d’exécution :
Autres exemples d’exceptions de type RunTimeException
Les deux instructions suivantes provoquent une exception de type NullPointerException. s1 est une
référence null sur un (futur) objet de type String. On ne peut pas accéder au troisième caractère de l’objet
String référencé par null, d’où l’exception.
String s1 = null; [Link] ([Link] (3));
Le programme suivant donne des exemples où une exception est lancée : chaîne à convertir en entier
ne contenant pas un entier (lecture erronée d’un entier par exemple), division par zéro, transtypage non
cohérent de deux objets de classes différentes, essai d’ouverture d’un fichier n’existant pas (voir
chapitre 7).
// [Link] differentes exceptions
import [Link].*;
public class TestException5 {
public static void main (String[] args) {
String s1 = null;
//exception NullPointerException ci-dessous
//[Link] ([Link](3));
// convertit la chaine "231" en un entier binaire
int n1 = [Link] ("231");
[Link] ("n1 : " + n1);
// exception car la chaine "231x" n’est pas un entier :
// exception NumberFormatException ci-dessous
//int n2 = [Link] ("231x");
//[Link] ("n2 : " + n2);
//int d = 0;
//int quotient = 17 / d; // exception de type ArithmeticException
//[Link] ("quotient : " + quotient);
//Object p = new Point(); // voir heritage, chapitre suivant
DR. BALKIS BETTOUMI 4
POO ISET BEJA 2023-2024
//Color coul = (Color) p; // exception ClassCastException :
// p n’est pas de la classe Color
[Link] ("Fin de main");
} // main
} // class TestException5
DR. BALKIS BETTOUMI 5