I5 : Programmation orientée objet avec Java

Documents pareils
Entrées / Sorties. Entrées / Sorties. Entrées/Sorties. System.out. Fonctionnement par flots (stream) Karima Boudaoud IUT- R&T. Terrain connu.

Projet de programmation (IK3) : TP n 1 Correction

Cours 14 Les fichiers

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Programmer en JAVA. par Tama

Flux de données Lecture/Ecriture Fichiers

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Développement Logiciel

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

INITIATION AU LANGAGE JAVA

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

PROGRAMMATION PAR OBJETS

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Premiers Pas en Programmation Objet : les Classes et les Objets

Langage Java. Classe de première SI

Programmation Objet Java Correction

Conventions d écriture et outils de mise au point

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Gestion distribuée (par sockets) de banque en Java

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

RMI le langage Java XII-1 JMF

ACTIVITÉ DE PROGRAMMATION

Programmation par les Objets en Java

Initiation à JAVA et à la programmation objet.

Plan du cours. Historique du langage Nouveautés de Java 7

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Programmation Internet en Java

Corrigé des exercices sur les références

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

TD/TP PAC - Programmation n 3

Auto-évaluation Programmation en Java

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Un ordonnanceur stupide

TD/TP PAC - Programmation n 3

Synchro et Threads Java TM

Java Licence Professionnelle CISII,

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Remote Method Invocation Les classes implémentant Serializable

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Programmation en Java IUT GEII (MC-II1) 1

Héritage presque multiple en Java (1/2)

Chapitre 10. Les interfaces Comparable et Comparator 1

F. Barthélemy. 17 mai 2005

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Bases Java - Eclipse / Netbeans

Tp 1 correction. Structures de données (IF2)

Introduction : les processus. Introduction : les threads. Plan

Remote Method Invocation (RMI)

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Cours Informatique Master STEP

Classe Interne, Anonyme & Enumération

Apprendre Java en 154 minutes

TP1 : Initiation à Java et Eclipse

Java 1.5 : principales nouveautés

LOG4430 : Architecture logicielle et conception avancée

as Architecture des Systèmes d Information

Programmation Réseau SSH et TLS (aka SSL)

Programmation système de commandes en C

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

La gestion des exceptions

Génie Logiciel avec Ada. 4 février 2013

et se trouve popularisé rapidement pour ses possibilités de développement liés au Web. Les

Java Licence Professionnelle CISII,

Environnements de développement (intégrés)

1. Structure d'un programme FORTRAN 95

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Support de cours et TD Programmation Orientée Objet

Architecture Orientée Service, JSON et API REST

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Programmation client-serveur sockets - RPC

Généralités sur le Langage Java et éléments syntaxiques.

Utiliser Java sans BlueJ

Sécurité Java 2. Première approche. Installation des exemples. Exemple d'une applet

Bases du langage. Historique Applications et applets Éléments de base du langage Classes et objets Les exceptions

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

TP, première séquence d exercices.

Corrigés des premiers exercices sur les classes


TP1. Outils Java Eléments de correction

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Utilisation d objets : String et ArrayList

Aide mémoire UML & Java 1ère partie : Introduction. marc.lemaire@u-cergy.fr

Introduction au langage Java

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

1 Lecture de fichiers

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

Compression de Données - Algorithme de Huffman Document de Conception

Une introduction à la technologie EJB (2/3)

Cours 1: Java et les objets

Transcription:

I5 : Programmation orientée objet avec Java 5. Exceptions et entrées-sorties Alexandre Niveau IUT de Caen Réseaux & Télécoms 18 novembre 2013 Adapté des cours de Dominique Rohard et Christophe Garion 0 / 29

Plan. 1 Exceptions. 2. 3 0 / 29

Plan. 1 Exceptions. 2. 3 0 / 29

Introduction On veut pouvoir changer le poids d'un chien Mais le nouveau poids doit être supérieur à 500g 1 / 29

Introduction On veut pouvoir changer le poids d'un chien Mais le nouveau poids doit être supérieur à 500g class Chien { private double poids ; public double getpoids() { return this. poids ; public void setpoids( double nouvpoids) { if ( nouvpoids > 0.5) { this. poids = nouvpoids ; Solution naïve : le changement n'est pris en compte que s'il est correct 1 / 29

Limites de la solution naïve Le problème : l'utilisateur ne saura pas que son changement n'a pas été pris en compte On peut lui indiquer, par exemple avec un print Mais l'erreur ne vient pas forcément directement de l'utilisateur : setpoids peut être appelée par une méthode class TestChien { public static void main( String[] args) { Chien medor = new Chien(); medor.setpoids (0.8); regime(medor); public static void regime( Chien c) { c. setpoids(c. getpoids() / 2); 2 / 29

Limites de l'affichage de l'erreur Deux problèmes : la méthode appelante ne verra pas le print et ne détectera donc pas l'erreur l'utilisateur verra un message d'erreur à l'écran, mais il ne saura pas pourquoi Solution : utiliser les exceptions 3 / 29

Limites de l'affichage de l'erreur Deux problèmes : la méthode appelante ne verra pas le print et ne détectera donc pas l'erreur l'utilisateur verra un message d'erreur à l'écran, mais il ne saura pas pourquoi Solution : utiliser les exceptions Une exception est un objet particulier, que l'on peut lancer avec le mot-clef throw : throw new Exception("Chien trop maigre"); Si l'on ne la traite pas, lancer une exception revient à afficher un message d'erreur et interrompre le programme 3 / 29

. Utilisation d'une exception class Chien { private double poids ; public double getpoids() { return this. poids ; public void setpoids( double nouvpoids) { if ( nouvpoids > 0.5) { this. poids = nouvpoids ; else { throw new RuntimeException( " Un chien doit peser plus de 500g!") ; 4 / 29

. Utilisation d'une exception : résultat Résultat à l'exécution de TestChien : $ java TestChien Exception in thread " main" java. lang. RuntimeException: Un chien doit peser plus de 500g! at Chien. setpoids( Chien. java: 10) at TestChien. regime( TestChien. java: 8) at TestChien. main( TestChien. java: 5) L'exception levée dans setpoids est propagée à la méthode appelante, et ainsi de suite jusqu'au sommet de la pile d'appel On voit la trace de ce e propagation dans le message d'erreur 5 / 29

. Récupération des exceptions En plus de l'affichage de la pile d'appels, l'utilisation d'une exception plutôt qu'un message d'erreur et un arrêt du programme a un énorme avantage : l'exception peut être récupérée et traitée class TestChien { public static void main( String[] args) { Chien medor = new Chien() ; medor. setpoids (0.8) ; regime( medor) ; public static void regime( Chien c) { try { c. setpoids(c. getpoids() / 2) ; catch( RuntimeException e) { System. out. println("régime terminé") ; 6 / 29

Bloc try...catch Si on a un bloc de code pouvant lever une exception, on peut récupérer l'exception et ainsi éviter que le programme s'arrête en utilisant un bloc try...catch try { System. out. println(c + " court"); c. setpoids(c. getpoids() / 2); System. out. println(c + " a maigri"); catch( RuntimeException e) { System.out. println(c + " ne peut plus maigrir"); Lorsqu'une exception est levée dans le bloc try, l'exécution s'arrête et passe directement au bloc catch : le reste du bloc try n'est pas exécuté 7 / 29

Traitement d'une exception and faut-il récupérer une exception? On ne récupère que les exceptions qu'on est capable de traiter, au moins partiellement Le traitement est effectué dans un bloc catch Traitements possibles : réparer le problème et recommencer rétablir un état cohérent et continuer sans recommencer utiliser une méthode différente réparer localement le problème et lancer une nouvelle exception arrêter le programme 8 / 29

Plan. 1 Exceptions. 2. 3 8 / 29

. Plusieurs exceptions Supposons que l'on veut également interdire aux chiens de dépasser 200 kg Il suffit de rajouter un test et un lancement d'exception : public void setpoids( double nouvpoids) { if ( nouvpoids <= 0.5) { throw new RuntimeException( "Trop maigre") ; else if ( nouv Poids > 200) { throw new RuntimeException( "Trop gros") ; else { this. poids = nouvpoids ; Problème? 9 / 29

Différents types d'exceptions Si on appelle setpoids dans un try...catch, on va récupérer à la fois l'exception levée si le chien est trop maigre et celle levée si le chien est trop gros en général, on veut les traiter différemment Pour faire plusieurs traitements différents, on peut me re plusieurs blocs catch pour un même bloc try Pour savoir quel bloc catch exécuter, Java se base sur le type de l'exception Exemples d'exceptions : ArithmeticException (division par 0 ) IndexOutOfBoundsException (indice hors du tableau) NullPointerException (appel d'une méthode ou d'un a ribut d'une instance null) FileNotFoundException IOException 10 / 29

Les exceptions forment une hiérarchie de sous-classes Object. Throwable Error VirtualMachineError OutOfMemoryError RuntimeException Exception IOException NoSuchMethodException ArithmeticException NullPointerException IndexOutOfBoundsException Une exception est une instance d'une classe qui descend de Throwable : throw new TrucException() 11 / 29

Les différentes sortes d'exceptions Les exceptions sont classées en deux catégories : exceptions hors contrôle : le programmeur n'est pas obligé de les traiter classes dérivées de Error (en rouge sur le schéma) : erreurs de machine virtuelle (plus de mémoire, classe non trouvée ), généralement non récupérables classes dérivées de RuntimeException (en vert sur le schéma) : erreurs de programmation, ne devraient pas se produire si le programme est correct (indice hors du tableau, division par zéro ) 12 / 29

Les différentes sortes d'exceptions Les exceptions sont classées en deux catégories : exceptions hors contrôle : le programmeur n'est pas obligé de les traiter classes dérivées de Error (en rouge sur le schéma) : erreurs de machine virtuelle (plus de mémoire, classe non trouvée ), généralement non récupérables classes dérivées de RuntimeException (en vert sur le schéma) : erreurs de programmation, ne devraient pas se produire si le programme est correct (indice hors du tableau, division par zéro ) exceptions sous contrôle : classes dérivées de Exception mais pas de RuntimeException. Elles sont prévisibles, et doivent absolument être récupérées et traitées (erreur de saisie de l'utilisateur, fichier non trouvé ), 12 / 29

Les différentes sortes d'exceptions Les exceptions sont classées en deux catégories : exceptions hors contrôle : le programmeur n'est pas obligé de les traiter classes dérivées de Error (en rouge sur le schéma) : erreurs de machine virtuelle (plus de mémoire, classe non trouvée ), généralement non récupérables classes dérivées de RuntimeException (en vert sur le schéma) : erreurs de programmation, ne devraient pas se produire si le programme est correct (indice hors du tableau, division par zéro ) exceptions sous contrôle : classes dérivées de Exception mais pas de RuntimeException. Elles sont prévisibles, et doivent absolument être récupérées et traitées (erreur de saisie de l'utilisateur, fichier non trouvé ), Exception et Error n'ajoutent aucune nouvelle caractéristique à Throwable : elles perme ent juste de classifier les erreurs possibles 12 / 29

. Multiple catch On peut utiliser la hiérarchie d'exceptions pour faire plusieurs blocs catch pour le même try try { /* code */ catch( FileNotFoundException e) { System. out. println(" Fichier non trouvé"); catch( IOException e) { System. out. println(" Erreur d'e/s"); catch( Exception e) { System.out.println("Erreur"); L'ordre des catch est fondamental : c'est le premier dont le type correspond à l'exception levée qui sera exécuté L'exécution reprend ensuite après le dernier catch 13 / 29

. Définir une nouvelle exception Pour créer son propre type d'exception, il suffit de spécialiser la classe Exception : class ChienMaigreException extends Exception { public ChienMaigreException( String message) { super( message); On utilise le constructeur standard qui prend en paramètre un message, qui est affiché si l'exception n'est pas récupérée Par convention, le nom d'une exception doit toujours se terminer par «Exception» Pour définir une exception hors contrôle, on peut spécialiser RuntimeException On ne spécialise pas Error (réservé aux erreurs de Java) 14 / 29

Récupérer ou déclarer Les exceptions sous contrôle doivent être traitées, sinon il y a erreur à la compilation Mais souvent, dans la méthode qui provoque l'exception, on ne sait pas quoi faire ; c'est la méthode appelante qui devrait récupérer l'exception Par exemple, setpoids() lance une ChienMaigreException, qui est traitée dans regime() Mais comment garantir que tous les programmeurs utilisant Chien traitent bien ce e exception? 15 / 29

Récupérer ou déclarer Les exceptions sous contrôle doivent être traitées, sinon il y a erreur à la compilation Mais souvent, dans la méthode qui provoque l'exception, on ne sait pas quoi faire ; c'est la méthode appelante qui devrait récupérer l'exception Par exemple, setpoids() lance une ChienMaigreException, qui est traitée dans regime() Mais comment garantir que tous les programmeurs utilisant Chien traitent bien ce e exception? Les exceptions sous contrôle doivent être soit récupérées, soit déclarées si une méthode ne sait pas comment traiter une exception sous contrôle, elle peut la propager mais elle doit alors déclarer dans sa signature qu'elle est susceptible de propager ce e exception elle délègue le traitement au code appelant, qui doit à son tour soit récupérer l'exception, soit déclarer qu'il peut la propager 15 / 29

Déclaration d'une exception propagée On utilise le mot-clef throws pour déclarer qu'une méthode peut propager une exception : public void setpoids( double nouvpoids) throws ChienMaigreException, GrosChienException { if ( nouvpoids <= 0.5) { throw new ChienMaigreException( "Trop maigre") ; else if (nouv Poids > 200) { throw new GrosChienException( "Trop gros") ; else { this. poids = nouvpoids ; 16 / 29

Récupération La méthode regime doit obligatoirement traiter les deux exceptions : public static void regime( Chien c) { try { c. setpoids(c. getpoids() / 2); catch( ChienMaigreException e) { System. out. println(" Régime termin é"); catch( GrosChienException e) { throw new RuntimeException( " Erreur inattendue : " + e); La deuxième exception ne devrait jamais arriver : on la récupère et on relance une exception hors contrôle 17 / 29

Conseils sur les exceptions Les exceptions ne sont pas censées remplacer un test simple ; il faut les réserver aux cas vraiment anormaux, exceptionnels, et non contrôlables (par exemple la saisie utilisateur) Multiplier les blocs try, pour gérer les exceptions de façon très fine, peut pénaliser les performances Ne pas museler les exceptions : try { /* beaucoup de code */ catch(exception e) { Si le compilateur signale des exceptions sous contrôle non gérées, c'est pour vous aider! Utiliser autant que possible les exceptions standard, plutôt que définir les vôtres : IllegalArgumentException, NumberFormatException, etc. (regarder dans l'api Java) 18 / 29

Plan. 1 Exceptions. 2. 3 18 / 29

Manipuler des fichiers Pour manipuler les fichiers et les répertoires, on utilise la classe java.io.file Elle fournit au programmeur un cadre unique, quel que soit le système d'exploitation sur lequel le programme est lancé, en cachant les détails d'implantation Constructeurs : File(String chemin) et File(File rep, String nom) 19 / 29

Méthodes de File Méthodes donnant les propriétés du fichier : boolean isfile() boolean isdirectory() String getname() : nom du fichier String getabsolutepath() : chemin absolu int length() : taille (pour un fichier) File[] listfiles() : renvoie la liste des fichiers (pour un répertoire) boolean canread() boolean canwrite() boolean canexecute() Méthodes manipulant les fichiers (renvoient true si tout s'est bien passé) : boolean createnewfile() crée le fichier boolean mkdir() crée le répertoire boolean renameto(file dest) renomme le fichier vers le fichier dest 20 / 29

. Exemple d'utilisation de File try { File toto= new File(" toto") ; System.out.println("toto créé : " + toto. createnewfile()) ; File dir = new File(".") ; File[] liste = dir. listfiles() ; for( int i = 0 ; i < liste. length ; i++) if ( liste[i]. isdirectory()) System. out. println(" DIR \t" + liste[i].getname()) ; else System. out. println( liste[i] + " " + liste[i].length()) ; catch ( IOException e ) { System.out.println(e.getMessage()) ; 21 / 29

Flux L'API d'entrée-sortie de Java est également définie dans le paquetage java.io Les entrées-sorties sont considérées comme des flux, c'est-à-dire des séquences de données ayant une source (flux d'entrée) ou une destination (flux de sortie) Les flux peuvent représenter des fichiers, des périphériques, d'autres programmes Les classes du paquetage java.io libèrent le programmeur des détails d'implantation spécifiques à chaque type de flux et à chaque système d'exploitation 22 / 29

Types de flux Deux types de flux : les flux de caractères (Unicode, 16 bits), pour le texte lisible par un humain les flux d'octets (8 bits), pour les données non textuelles (images, son, vidéo ) atre classes abstraites de base (deux types deux directions) : Reader et Writer pour les flux de caractères InputStream et OutputStream pour les flux d'octets On va présenter rapidement ces classes ; pour plus de détails, aller voir l'api 23 / 29

Flux de caractères elques méthodes de la classe abstraite Reader : int read() : lit un caractère et le renvoie sous forme d'entier, ou 1 si on a a eint la fin du flux int read(char[] dest, int debut, int nb) : lit nb caractères et les place dans le tableau dest à partir de l'indice debut ; Renvoie le nombre de caractères lus, ou 1 long skip(long nb) : permet de sauter nb caractères du flux ; renvoie le nombre de caractères sautés, ou 1 24 / 29

Flux de caractères elques méthodes de la classe abstraite Reader : int read() : lit un caractère et le renvoie sous forme d'entier, ou 1 si on a a eint la fin du flux int read(char[] dest, int debut, int nb) : lit nb caractères et les place dans le tableau dest à partir de l'indice debut ; Renvoie le nombre de caractères lus, ou 1 long skip(long nb) : permet de sauter nb caractères du flux ; renvoie le nombre de caractères sautés, ou 1 elques méthodes de la classe abstraite Writer : void write(int ch) : écrit le caractère correspondant à l'entier Unicode ch void write(char[] src, int debut, int nb) : écrit nb caractères du tableau src à partir de l'indice debut void flush() : vide le flux (supprime les caractères en a ente) Méthode commune : void close(), pour fermer le flux Toutes ces méthodes peuvent lever une IOException 24 / 29

Flux de caractères et fichiers Les classes concrètes réalisant Reader et Writer pour gérer le contenu de fichiers sont FileReader et FileWriter Plusieurs constructeurs ; les plus utiles sont ceux qui prennent comme paramètre une String qui est le nom du fichier un File 25 / 29

. Flux et fichiers : exemple import java.io.* ; public class TestFluxFichiers { public static void main( String[] args) { try { Reader entree = new FileReader(" toto") ; char[] contenu = new char[100] ; entree. read( contenu, 0, 100) ; entree.close() ; Writer sortie = new FileWriter(" tutu") ; sortie. write( contenu, 0, 100) ; sortie.close() ; catch( IOException e) { System. out. println(" Erreur d'e/s : " + e.getmessage()) ; 26 / 29

Flux de caractères bufferisés Les flux «bufferisés» utilisent un tampon (buffer) les caractères ne sont pas lus ou écrits un par un, mais en blocs gain de performance si l'accès au flux est coûteux (ex. fichiers) utilisation de flush() pour forcer l'écriture du contenu du tampon Classes BufferedReader et BufferedWriter Les constructeurs prennent en paramètre un Reader ou un Writer et le «bufferisent». Exemple : new BufferedWriter(new FileWriter("toto")) crée un flux de caractères bufferisé vers le fichier toto Ils perme ent de travailler avec des lignes de caractères : String readline() pour BufferedReader void write(string ligne) pour BufferedWriter 27 / 29

Flux d'octets Les classes abstraites InputStream et OutputStream sont très proches de Reader et Writer, mais leurs méthodes utilisent des octets à la place des caractères : int read(byte[] dest, int nb) dans InputStream int write(byte[] src, int nb) dans OutputStream Classes concrètes correspondantes à celles déjà vues : FileInputStream et FileOutputStream pour les flux d'octets depuis ou vers un fichier BufferedInputStream et BufferedOutputStream pour les flux d'octets bufferisés 28 / 29

Flux d'impression Classes concrètes particulières pour les flux de sortie : les flux d'impression flux d'octets : PrintStream flux de caractères : PrintWriter Perme ent d'écrire directement des types primitifs, des String, et n'importe quel objet, grâce à la méthode tostring : PrintStream flux = new PrintStream("toto"); flux.println(new Chien("Médor")); Définissent les méthodes print et println System.out est en fait une instance de PrintStream, dont la destination est la console 29 / 29