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