Erreurs d'exécution (1/3) Dans tout programme, il peut y avoir des erreurs d'exécution non critiques Exemple : le programme est en train de lire un fichier et il y a un problème d'accès au disque dur. NB : il ne s'agit ni d'erreur de programmation, que le compilateur peut détecter, ni d'erreur critique qui empêche la suite de l'exécution. Quand il y a une erreur non critique, on voudrait que le programme ne plante pas complètement et puisse récupérer de cette erreur et continuer. Exemple : s'il y a un échec de lecture d'un fichier, le programme doit continuer en retentant la lecture ou en passant à autre chose. Licence Informatique - Semestre 2 - Algorithmique et Programmation 1 Erreurs d'exécution (2/3) Les erreurs se produisent dans un contexte d'exécution mais peuvent influer sur les contextes englobant. programme EditeurDeTexte ... début … si (clic sur le bouton « ouvrir fichier ») alors ... chaine c ← lireFichier(...); ... fin chaine fonction lireFichier(chaine nomFichier) ... début … chaine d ← lireLigne(...) ; ... chaine fonction lireLigne(chaine nomFichier, entier ligne) fin ... début ... // accès disque ... fin Licence Informatique - Semestre 2 - Algorithmique et Programmation 2 Erreurs d'exécution (3/3) Le principe d’endiguement : - un programme est une hiérarchie de contextes d’exécution - une erreur d'exécution récupérable doit être récupérée à un certain niveau pour éviter la plante complète du programme - pour déléguer le traitement d'une erreur d'un contexte d'exécution à l'autre, il faut pouvoir transférer une description de l'erreur (exception) main une erreur un contexte d’exécution le contexte d’exécution qui traite l'erreur Licence Informatique - Semestre 2 - Algorithmique et Programmation 3 Exception Une exception décrit une erreur : son type, les données qui ont provoqué l'erreur, etc Exception e = … System.out.println(e.getMessage()); // écrit le message de l'erreur e.printStackTrace(); // affiche la trace de l'exécution qui a mené à l'erreur En Java, il existe tout un tas de types d'exception : IOException, ArithmeticException,ArrayIndexOutOfBoundsException, … En Java, il est possible de créer ses propres types d'exception : /** Exception lancée en cas de bombardement nucléaire */ public class AtomicBombingException extends Exception{ public AtomicBombingException(){ super("Erreur due à une destruction totale de l'ordinateur"); } } Licence Informatique - Semestre 2 - Algorithmique et Programmation 4 Lancement des exceptions Si on écrit une fonction qui peut lancer une exception, on doit le préciser dans son en-tête : String lireLigne(String nomFichier, int ligne) throws IOException { ... if(...){ // accès disque impossible throw new IOException("Impossible d'accéder à ce #@$! disque"); } ... } Licence Informatique - Semestre 2 - Algorithmique et Programmation 5 Traitement des exceptions try{ // bloc de code contenant une instruction pouvant lancer une exception ... String s = lireLigne("fichier.txt",12); ... } catch(IOException e){ // récupération d'une exception de type IO System.out.println(e.getMessage()); } catch(FileNotFoundException e){ e.printStackTrace(); } finally{ // bloc de code exécuté qu'il y ait exception ou pas ... } L'appel à une fonction susceptible de lancer une exception doit être réalisé dans un bloc try. Un seul bloc catch est exécuté, le premier rencontré qui correspond au type de l'exception. Le bloc finally est toujours exécuté mais il est optionnel. Licence Informatique - Semestre 2 - Algorithmique et Programmation 6 Flux (1/2) un flux (stream) est un mécanisme qui encapsule la transmission de données, en lecture ou en écriture, entre un programme et d'autres programmes, fichiers ou dispositifs flux en écriture sur une imprimante flux en écriture sur un écran programme en train de s'exécuter flux en lecture sur un clavier flux en écriture sur un programme flux en lecture sur un fichier fichier toto Licence Informatique - Semestre 2 - Algorithmique et Programmation programme en train de s'exécuter sur une autre machine 7 Flux (2/2) Un flux permet une gestion (quasi)-uniforme de ces transmissions de données. Exemple : du point de vue du programmeur, écrire une chaine de caractère à l'écran, dans un fichier situé sur une autre machine d'un réseau ou sur une imprimante se fait (quasiment) de la même manière. Des flux par défaut existent en Java : System.in est un flux en lecture sur le clavier System.out est un flux en écriture sur l'écran On distingue les flux d'entrée (les données arrivent de l'extérieur du programme) et les flux de sortie (les données sont envoyées à l'extérieur du programme). Licence Informatique - Semestre 2 - Algorithmique et Programmation 8 Flux en lecture sur un fichier (1/2) try{ FileReader fr = null; try{ fr = new FileReader("monfichier.truc"); // ouvre le flux et se positionne au début while(fr.ready()){ int c = fr.read(); // lit un caractère comme entier entre 0 et 65535 fr.skip(23); // saute 23 caractères fr.mark(12); // pose une marque sur le caractère courant, qui sera marqué tant que 12 octets n'auront pas été lus ... fr.reset(); // repositionne le flux au dernier caractère marqué. Si aucun caractère n'est marqué, une IOException est lancée) ... } } catch(FileNotFoundException e){System.out.println("fichier introuvable!");} catch(IOException e){System.out.println("Problème d'entrée sortie : " +e.getMessage());} finally{ if(fr != null) fr.close(); // ne pas oublier de fermer le flux } } catch(IOException e){System.out.println("Problème d'entrée sortie : " +e.getMessage());} Licence Informatique - Semestre 2 - Algorithmique et Programmation 9 Flux en lecture sur un fichier (2/2) try{ FileReader fr = null; BufferedReader br = null; try{ fr = new FileReader("monfichier.truc"); br = new BufferedReader(fr); // met le flux dans un tampon while(br.ready()){ int c = br.read(); // lit un caractère comme entier entre 0 et 65535 String s = br.readLine(); // lit une ligne entière ... } } catch(FileNotFoundException e){ System.out.println("fichier introuvable!"); } catch(IOException e){ System.out.println("Problème d'entrée sortie : "+e.getMessage()); } finally{ if(br != null) br.close(); if(fr != null) fr.close(); // ne pas oublier de fermer le flux } } catch(IOException e){ System.out.println("Problème d'entrée sortie : "+e.getMessage()); } Licence Informatique - Semestre 2 - Algorithmique et Programmation 10 Flux en écriture sur un fichier try{ FileWriter fw = null; try{ fw = new FileWriter("monfichier.ext"); // ouvre le flux fw.write(75); // écrit un 'K' dans le fichier … fw.write('\n'); // écrit un saut de ligne dans le fichier ... String s = "Bonjour le monde"; fw.write(s,3,6); // écrit "jour l" dans le flux ... } catch(FileNotFoundException e){ System.out.println("fichier introuvable!"); } catch(IOException e){ System.out.println("Problème d'entrée sortie : "+e.getMessage()); } finally{ if(fw != null) fw.close(); // ne pas oublier de fermer le flux } } catch(IOException e){ System.out.println("Problème d'entrée sortie : "+e.getMessage()); } Licence Informatique - Semestre 2 - Algorithmique et Programmation 11 Pour aller plus loin D'autres classes de l'API Java permettent de gérer les flux et les fichiers de façon bien plus compliquée mais bien plus puissante. La documentation de l'API Java : http://docs.oracle.com/javase/7/docs/api/ Le tutoriel java concernant la gestion des entrées-sorties : http://java.sun.com/docs/books/tutorial/essential/io/index.html Pour l'encodage des caractères, voir le site de l'UNICODE : www.unicode.org/charts/PDF/U0000.pdf pour les codes ASCII unicode.org en général pour l'encodage Licence Informatique - Semestre 2 - Algorithmique et Programmation 12