Académique Documents
Professionnel Documents
Culture Documents
Et de Technologie de Sousse
TD 7 : Exceptions
Dans ce TD, on verra en particulier :
1
// TestException1.java
public class TestException1 {
public static void main (String[] args) {
int tabEnt[] = { 1, 2, 3, 4 };
// Exception de type java.lang.ArrayIndexOutOfBoundsException non contrôlée par le
//programme ; erreur d’exécution
tabEnt [4] = 0; // erreur et arrêt
System.out.println ("Fin du main"); // le message n’apparait pas
} // main
} // class TestException1
Résultats d’exécution :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at Exeption_.TestException1.main(TestException1.java:18)
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 contrôlée par le programme
2
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.
// PPTestException3.java Exception lancée 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 captée
System.out.println("Fin de initTableau"); // non exécutée
}
void ecrireTableau () {
for (int i=0; i < tabEnt.length; i++) {
System.out.print (" " + i);
}
System.out.println();
}
} // class TestException3
3
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) { // captée ici
System.out.println ("Exception : " + e); // écrit le message
}
System.out.println("Fin de initTableau"); // exécutée
}
void ecrireTableau () {
for (int i=0; i < tabEnt.length; i++) {
System.out.print (" " + tabEnt[i]);
}
System.out.println();
}
} // class TestException4
4
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, etc.
TestException5.java différentes exceptions
import java.awt.*;
public class TestException5 {
public static void main (String[] args) {
String s1 = null;
//exception NullPointerException ci-dessous
//System.out.println (s1.charAt(3));
// convertit la chaine "231" en un entier binaire
int n1 = Integer.parseInt ("231");
System.out.println ("n1 : " + n1);
// exception car la chaine "231x" n’est pas un entier :
// exception NumberFormatException ci-dessous
//int n2 = Integer.parseInt ("231x");
//System.out.println ("n2 : " + n2);
//int d = 0;
//int quotient = 17 / d; // exception de type ArithmeticException
//System.out.println ("quotient : " + quotient);
//Object p = new Point(); // voir chapitre héritage
//Color coul = (Color) p; // exception ClassCastException :
// p n’est pas de la classe Color
System.out.println ("Fin de main");
} // main
} // class TestException5
5
Dans un catch, on peut capter l’exception à son niveau le plus général (Exception),
ou à un niveau plus bas (FileNotFoundException par exemple) de façon à avoir un
message plus approprié. On peut avoir plusieurs catch pour un même try.
L'objectif de l'exemple est d'écrire une méthode moyenne qui calcule la moyenne
d'entiers reçus en paramètre par un tableau de chaînes de caractères. Les chaînes ne
représentant pas un entier (et donc erronées) doivent être ignorées. Néanmoins, on veut de
plus que la méthode moyenne lance une exception de type ExceptionRien si aucune chaîne de
caractères n'est valide afin d'éviter la division par zéro. Une méthode main dans la classe
EssaiLance permet de tester la méthode moyenne de la classe Lance.
6
public class Lance {
static int moyenne(String[] liste) throws ExceptionRien {
int somme = 0, nbEntiers = 0;
for (String chaine : liste) {
try {
somme += Integer.parseInt(chaine);
nbEntiers++;
}
catch (NumberFormatException e) {
System.out.println(chaine + " n'est pas entier");
}
}
if (nbEntiers == 0) throw new ExceptionRien(liste.length);
return somme/nbEntiers;
}
}
class EssaiLance {
public static void main(String[] arg) {
try {
System.out.println("La moyenne est " + Lance.moyenne(arg));
}
catch (ExceptionRien e) {
e.printStackTrace();
}
}
}
On obtient :
7
throws ExceptionRien : la méthode moyenne indique ainsi qu'il est possible qu'une de ses
instructions envoie une exception de type ExceptionRien sans que celle-ci soit attrapée par un
mécanisme try-catch. Il est obligatoire d'indiquer ainsi un éventuel lancement d'exception non
attrapée, sauf pour les exceptions les plus courantes de l'API. Si vous oubliez de signaler par la
clause throws l'éventualité d'un tel lancement d'exception, le compilateur vous le rappellera.
Ces deux exemples n'apportent rien de nouveau. Il reste juste à savoir que la classe
Exception possède un constructeur prenant en paramètre une chaîne de caractères et que la
méthode getMessage de la classe Exception renvoie cette chaîne de caractères. Vous pouvez
aussi constater que plusieurs blocs catch peuvent se succéder eu attrapant des exceptions de
types différents.
Exemple 1
8
Que donne ce programme lancé avec :
java EssaiMoyenne ha 2 -3 27 18
java EssaiMoyenne ha -3
class Moyenne {
static int moyenne(String[] liste) throws ExceptionRien {
int somme = 0,entier, nbEntiers=0;
int i;
class EssaiMoyenne {
public static void main(String[] arg) {
try {
System.out. println("La moyenne est "+ Moyenne.moyenne(arg));
}
catch (ExceptionRien e) {
e.printStackTrace();
}
}
}
9
Exemple 2
java EssaiAttrape ha 15 12
class Attrape {
10