Chapitre 6: Les exceptions Traitement des exceptions (1)

publicité
09/06/2014
Chapitre 6: Les exceptions
Décrire les actions à faire lorsqu'un événement inattendu survient
(appel incorrect d'une méthode, ouvrir un fichier inexistant, ...)
 Il y a des classes prédéfinies qui indiquent les types d
d'exceptions
exceptions
possibles: Exception (classe mère: toute exception), IOException
(exception d'E/S), ArithmeticException (division par 0, ...), ...etc.
Exemple:
public class TraiterArguments {
public static void main(String [] args){
int S=0; for (int i=0; i<args.length; i++)
S = S + Integer.parseInt( args[ i ] ) ;
System.out.println("Somme= " + S); } }

L'exécution:
Erreur
C:\TP_JAVA> java TraiterArguments 23
Trois 34 8
Exception in thread "main" java.lang.NumberFormatException: .....
96
POO \ N.EL FADDOULI
Traitement des exceptions (1)
Traitement des exceptions en deux étapes:
– Détecter (découvrir) l'exception
– Résoudre (traiter) ll'exception
exception
 Utilisation des clauses try et catch
Exemple:
import java.lang.*;

public class TraiterArguments
{
public static void main(String [] args) { int S=0;
try { for (int i=0; i<args.length;
i<args length; i++) S = S + Integer.parseInt(args[
Integer parseInt(args[ i ] ); }
catch( NumberFormatException e )
{ System.err.println ("L'un des argument n'est pas un entier"); }
System.out.println("Somme = " + S); } }
Quel est le résultat de: C:\TP_JAVA> java TestArguments 5 7 ab 9
POO \ N.EL FADDOULI
97
1
09/06/2014
Traitement des exceptions (2)

Utilisation des clauses try et catch sur des parties réduites de codes.
Exemple: Utiliser try-catch à l'intérieur de la boucle for pour rejeter les
arguments en ligne qui ne sont pas des entiers.
entiers
public class TraiterArguments {
public static void main(String [] args) { int S=0;
for (int i=0; i<args.length; i++)
try { S = S + Integer.ParseInt(args[ i ] ); }
catch( NumberFormatException e )
{ System.err.println ("L'élément "+ args[ i ]+ " a été ignoré"); }
System.out.println("Somme = " + S); } }
Quel est le résultat de: C:\TP_JAVA> java TestArguments 5 7 ab 9 h 3.5 4
98
POO \ N.EL FADDOULI
Utilisation de plusieurs clauses catch (1)

Possibilité d'avoir plusieurs clauses catch après le bloc try.

Chacun gère un type d'exception différent.
Syntaxe:
try { ......
// code pouvant générer plusieurs exceptions
}
catch(exception1 e1) { // code exécuté s'il y a une exception de type exception1
..... }
catch(exception2 e2) {// code exécuté s'il y a une exception de type exception2
..... }
catch(exception3 e3) {// code exécuté s'il y a une exception de type exception3
..... }
POO \ N.EL FADDOULI
99
2
09/06/2014
Utilisation de plusieurs clauses catch (2)
Exemple:
try { ......
// code pouvant générer plusieurs exceptions
}
catch(NumberFormatException e1)
{System.out.println( "Erreur de conversion:") ;}
catch(ArrayIndexOutOfBoundsException e2)
{ System.out.println( e2.getMessage());}
catch(ArithmeticException e3)
{System.out.println(
"Erreur
mathématique:"
e3.getMessage());}
+
100
POO \ N.EL FADDOULI
Lecture de données
Utilisation des deux classes prédéfinies InputStreamReader et
BufferedReader comme suit:
import java.io.
java io *;;
......
String S;
try { InputStreamReader lecteur = new InputStreamReader(System.in);

BufferedReader entree = new BufferedReader(lecteur);
S = entree.readLine( );
}
catch(IOException err){
System.out.println(err.getMessage());
System.exit(-1); }
System.out.println(S); // traiter S: l'afficher, la convertir, ...S
POO \ N.EL FADDOULI
101
3
09/06/2014
Lecture de données
Exemple: Classe permettant de lire des entiers et des réels
import java.io.*;
public class Lire
{ public static String Chaine()
{ String S;
InputStreamReader L = new InputStreamReader(System.in);

BufferedReader E = new BufferedReader(L);
try {
S = E.readLine( );
}
catch(IOException err){ S ="";}
return (S);
}
POO \ N.EL FADDOULI
102
Lecture de données
(suite)
public static int Entier() { return Integer.parseInt (chaine()) ; }
public static double Reeld() { return Double.parseDouble
Double parseDouble (chaine()) ; }
public static float Reels(){ return Float.parseFloat (chaine()) ;}
}
Test de cette classe dans la méthode main:
int i; double d; float f; String s;
i = Li
Lire.Entier(
E ti ( ));
d = Lire.Reeld( );
f = Lire.Reels( );
s = Lire.chaine( );
........
POO \ N.EL FADDOULI
103
4
Téléchargement