Sujets abordés et exemples - semaine 11 Exceptions Les

publicité
Sujets abordés et exemples - semaine 11
Exceptions
Les exceptions sont des erreurs qui sont retournées lorsqu’une méthode ne peut
poursuivre son exécution normale.
public class ProgrammeExceptions
{
public static void main(String[] args) {
int nombre;
System.out.print("Entrez un nombre: ");
nombre = Clavier.lireInt();
}
}
Si l’usager tape un entier, Clavier.lireInt() retourne un résultat correct. Par contre, si
un caractère est entré, Clavier.lireInt()interrompt son exécution, et retourne une erreur
au lieu d’un résultat de type int. Cette erreur est une exception. Si elle n’est pas traitée,
l’exception entraîne la terminaison du programme. Dans l’exemple, le message suivant
est affiché :
java.lang.NumberFormatException: For input string: "r"
at
java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:468)
at java.lang.Integer.parseInt(Integer.java:518)
at Clavier.lireInt(Clavier.java:227)
at ProgrammeExceptions.main(ProgrammeExceptions.java:12)
Le message indique que l’exception est de type java.lang.NumberFormatException (une
exception prédéfinie dans le langage) survenue suite à une erreur dans la méthode
java.lang.Integer.parseInt de la classe Integer, appelée par la méthode lireInt à la
ligne 227 de la classe Clavier, elle-même appelée dans la méthode main de notre classe,
ProgrammeException, à la ligne 12.
En général, le plus simple est de commencer par le bas (ici ProgrammeException, et de
retracer le chemin de l’erreur dans notre code (par exemple, on s’arrêterait de chercher à
la classe Clavier) jusqu’à ce qu’on arrive à trouver la source de l’erreur.
Certaines erreurs, comme celle dans l’exemple, dépendent de circonstances hors du
contrôle du programmeur (on ne peut prévoir ce que l’utilisateur va taper). Dans ces
situations, on va prévoir une manière de gérer l’erreur pour que le programme ne plante
pas.
/**
* Exemple de gestion d'exceptions
*
* @author Stéphane Lévesque
*/
public class ProgrammeExceptions
{
public static void main(String[] args) {
int nombre;
boolean nombreCorrect = false;
while (!nombreCorrect) {
System.out.print("Entrez un nombre: ");
try {
nombre = Clavier.lireInt();
System.out.println("le nombre " + nombre + " est correct.");
nombreCorrect = true;
} catch (NumberFormatException erreur) {
System.out.println("la valeur entrée n'est pas un nombre,
veuillez recommencer.");
}
}
}
}
Exécution :
Entrez un
la valeur
Entrez un
la valeur
Entrez un
le nombre
nombre: r
entrée n'est pas un nombre, veuillez recommencer.
nombre: e
entrée n'est pas un nombre, veuillez recommencer.
nombre: 3
3 est correct.
La clause try {} définit un bloc d’instructions à exécuter dans le cas où tout va bien.
Le bloc catch qui suit prévoit des instructions à exécuter en cas de problème.
Pour définir le bloc catch, on doit nommer l’exception à traiter (dans l’exemple,
NumberFormatException) et l’affecter à une variable, comme un paramètre. On pourra
ensuite utiliser cette variable, par exemple pour afficher un rapport d’erreur.
/**
* Exemple de gestion d'exceptions
*
* @author Stéphane Lévesque
*/
public class ProgrammeExceptions
{
public static void main(String[] args) {
int nombre;
boolean nombreCorrect = false;
while (!nombreCorrect) {
System.out.print("Entrez un nombre: ");
try {
nombre = Clavier.lireInt();
System.out.println("le nombre " + nombre + " est correct.");
nombreCorrect = true;
} catch (NumberFormatException erreur) {
System.out.println("la valeur entrée n'est pas un nombre,
veuillez recommencer.");
}
}
nombreCorrect = false;
while (!nombreCorrect) {
System.out.print("Entrez un nombre: ");
try {
nombre = Clavier.lireInt();
System.out.println("le nombre " + nombre + " est correct.");
nombreCorrect = true;
} catch (NumberFormatException erreur) {
erreur.printStackTrace();
}
}
}
}
Exécution :
Entrez un nombre: 5
le nombre 5 est correct.
Entrez un nombre: d
java.lang.NumberFormatException: For input string: "d"
at
java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:468)
at java.lang.Integer.parseInt(Integer.java:518)
at Clavier.lireInt(Clavier.java:227)
at ProgrammeExceptions.main(ProgrammeExceptions.java:29)
Entrez un nombre: 2
le nombre 2 est correct.
Dans la deuxième boucle, l’information sur l’erreur est affichée, mais le programme n’est
pas interrompu parce que l’exception a été traitée.
On peut prévoir des traitements différents pour plusieurs types d’erreurs.
try{
…
} catch (PremierTypeDException e1) {
…
} catch (DeuxiemeTypeDException e2) {
…
} finally {
…
}
La clause finally contient des instructions qui seront exécutées peu importe qu’une
erreur se produise ou non.
Pour lancer une exception, une méthode devra utiliser l’instruction throw, et annoncer la
possibilité d’une exception dans sa déclaration:
/**
* Exemple de gestion d'exceptions
*
* @author Stéphane Lévesque
*/
public class ProgrammeExceptions
{
public static void lanceException(boolean erreur) throws Exception
{
if (erreur) {
throw new Exception("Erreur sur demande");
} else {
System.out.println("Erreur non demandée.");
}
}
public static void main(String[] args) {
int nombre;
boolean nombreCorrect = false;
while (!nombreCorrect) {
System.out.print("Entrez un nombre: ");
try {
nombre = Clavier.lireInt();
System.out.println("le nombre " + nombre + " est correct.");
nombreCorrect = true;
} catch (NumberFormatException erreur) {
System.out.println("la valeur entrée n'est pas un nombre,
veuillez recommencer.");
}
}
nombreCorrect = false;
while (!nombreCorrect) {
System.out.print("Entrez un nombre: ");
try {
nombre = Clavier.lireInt();
System.out.println("le nombre " + nombre + " est correct.");
nombreCorrect = true;
} catch (NumberFormatException erreur) {
erreur.printStackTrace();
}
}
try {
lanceException(false);
lanceException(true);
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("Fin du programme");
}
}
}
Exécution :
Entrez un nombre: 5
le nombre 5 est correct.
Entrez un nombre: 3
le nombre 3 est correct.
Erreur non demandée.
java.lang.Exception: Erreur sur demande
at ProgrammeExceptions.lanceException(ProgrammeExceptions.java:10)
at ProgrammeExceptions.main(ProgrammeExceptions.java:46)
Fin du programme
Un appel à une méthode qui lance une exception (qui a une clause throw dans sa
déclaration) doit être fait à l’intérieur d’un bloc try, sinon le compilateur le refusera.
Voir l’annexe D du livre de référence pour la liste des exceptions usuelles.
Téléchargement