1) | Cours 1.1 | Cours 1.2 | |
2) | Cours 2.1 | Cours 2.2 | TP 2 |
3) | Cours 3 | ||
4) | Cours 4 | ||
5) | Cours 5 | ||
6) | Cours 6 | ||
7) | Cours 7 | ||
8) | (Cours 8) |
Cours 1.1I. Présentation de l'unité[+ Séquencement de l'unité] Ce premier cours de la séquence 1 = introduction ; le prochain rentre dans le vif du sujet ==> beaucoup plus dense. I.5. Objectifs - approche objet - solution en français à un problème (à découper en sous-problèmes) - langage Java et quelques bibliothèques - pas seulement fonctionner, aussi "bien" programmé - expérience pratique et opérationnelle - les objets d'abord, apprentissage incrémental (pas tout d'une notion) - polycopié = aide-mémoire, autre présentation (utile, mais pas la même progression pédagogique) - livre très pédagogique, non indispensable, couvre beaucoup plus de choses (3ème ou 4ème édition seulement, english is better). - td : cours relu, apporter notes de cours, ne pas attendre de correction/essayer, poser des questions, terminer seul les exercices et les essayer sur machine - tp : cours relu, apporter notes de cours et TD, ne pas regarder une solution, partager le clavier, poser des questions, terminer seul les exercices, demander de l'aide Lire le premier chapitre de ce poly. II.2. Performances du matériel - mémoire RAM : 1Go (8), 10ns ==> 10x plus lent, (+ cache, - multi-processeurs, + multi-accès ...) - disque dur : 1To (1/4), 10ms ==> 1 million x plus lent (==> charger, traiter, sauvegarder) [+ Description d'un ordinateur] II.3.2. Niveaux : machine (binaire, 0/1), assemblage (ex: 68k, macro), haut-niveau (X=Y+Z+1) II.3.3. Traducteurs (assembleur, compilateur, interpréteur) II.3.4. "Philosophies" : impératif ou déclaratif (rare), fonctionnel, script, structuré ou non (rare), Orienté Objet ou non (classique) II.3.5. Exemples : C, C++, Java, lisp/scheme, camL, prolog, shell, perl, php, python, ruby, javascript, tcl/tk (outils en électronique), objective-C (iPhone), pascal/delphi, basic/visual (bureautique), ... II.3.6. Historique (C, C++, Java) II.3.6.b. C++ : 1983, ", C O.O., compatible ANSI-C, ISO-C++ 1998 puis 2003, mieux mais bas niveau existe toujours, compilé. II.3.6.c. Java : 1995, Sun MicroSystems, O.O., Java non OO = C++ non OO = C, pas de bas niveau - source compilé en bytecode, puis interprêté - avantages = indépendance matérielle, code très petit - inconvénients = lenteur (realtive, 20x, <2x, temps réel, militaire), JVM très grosse, lente à démarrer (pas un problème pour les serveurs) II.3.6.e. Les versions de SE : 1.0 .. 1.4.2 | 1.5 1.6 v7? (open source) - JRE = Java Runtime Environment (=JVM, utilisation seulement) ≠ ⊂ JDK = Java Development Kit (aussi développement) - nombre de classes = 200 (v1) à 3700 (v6) - non OO identique à C/C++ (mais C reste indispensable sur certains kits et pour certaines applications) - demandé dans les offres d'emploi (> C/C++, standard pour développements web=JEE) - Java et C ==> se mettre à C++ (3ème langage moins difficile que 2ème) - différence avec les maths ? - analogie culinaire : ingrédients, étapes, solutions multiples - plusieurs algorithmes pour résoudre le même problème ==> choix, coût : performance/mémoire/matériel/lisibilité II.4.3. Exemple de la multiplication (par un nombre à plusieurs chiffres) II.4.3.b. Algorithme "à la Russe" (lire v1) II.4.3.c. Exemple 45x19 (lire) II.4.3.d. Avantages (opérations binaires) II.4.3.e. Optimisation (moins d'opérations si plus petit nombre à gauche ==> échange) II.4.3.g. Traduction en Java (pour les curieux)
|
Cours 1.2I. Introduction à la P.O.O.I.2 P.O.O. (voir dessin) § I.3 Encapsulation (protection autour de la classe et non de l'objet, données privées, services publics) II.2 Objet (exemplaire, en mémoire, dynamique, morceau de pâte) II.3 Exemple: classe Cercle (x, y, rayon), objets c1 et c2 (voir dessin) § Lire ce document (chapitres 1 & 2) sur la représentation des entiers et les débordements arithmétiques. III.2 Valeur logique (booléenne), vrai ou faux (pas 0 ou 1), conditions/comparaisons III.3 Mot ou phrase (chaîne de caractères) III.4 Initialisation des attributs (par défaut selon le type, automatiquement) IV.1.2 même nom, mais signatures différentes (surcharge) IV.2.2 procédure (ne retourne rien, type Néant, appelé sur un objet) IV.2.3 constructeur (très spécial, pas de type, pas d'objet, automatique) : initialisation des attributs IV.4 Variable locale ({entre}, type, nom, ni attribut ni paramètre, non initialisée, ni publique ni privée) V.1.2 Espacement (significatif entre 2 mots/indifférent sinon, un ou plusieurs, [ESPACE]/[TABULATION]/[ENTREE] ) V.1.3 Indentation (décalages/alignements reflètent la structure) V.1.4 Présentation/style : guide de style V.1.5 vérifiée à la compilation, => erreurs => BIEN LIRE LES MESSAGES D'ERREUR V.2.2 C: UneClasse => O: fichier UneClasse.java (UneClasse.class) V.2.3 C: aNomAttribut, verbeMethode(), pNomParametre, vNomVariableLocale V.2.4 O: exception: le constructeur (= nom de la classe), contradiction ? V.3.2 Booléen : boolean (false/true, défaut: false) V.3.3 Chaîne : String ("des mots", défaut: "") ** Lire le poly :
|
TP 1Projet shapes. (sujet) |
Cours 2.1I. Commentaires et documentationI.2 /** jusqu'à */ (multiligne, ignoré par compilateur mais JavaDoc) I.3 Conseils: /** ... */ AVANT chaque classe et AVANT chaque méthode I.3.2 Méthode : @param et @return I.3.3 Lire ce guide I.5 Dans BlueJ : bouton implémentation (→ source java) / interface (→ javadoc) II.2 Attribut : private Type aNomAttribut; public Type nomFonction( paramètres_formels ) { instructions; return expression; } II.4 Procédure : public void nomProcedure( paramètres_formels ) { instructions; } II.5 Constructeur : public NomClasse( paramètres_formels ) { instructions; } - mais surcharge ==> plusieurs constructeurs ==> plusieurs moyens d'initialiser un objet (exemple: "origine" ==> 0,0) II.8 Initialisation : Type vNom = valeurInitiale; II.9.2 Méthode : déclaration = juste signature II.9.3 Variable = définition = initialisation II.10.2 Paramètre (formel) : pendant l'exécution de la méthode / interne à la méthode II.10.3 Variable locale : depuis sa déclaration jusqu'à la fin du bloc / interne au bloc III.2 affectation (ou assignation ou ←) non symétrique : vNom= expression; III.5 Affichage (non graphique ==> terminal,console / linux,dos,BlueJ) : System.out.println( uneString ); III.5.2 concaténation d'un type primitif : "Resultat=" + vRes → "Resultat=12" si vRes vaut 12 III.5.3 println ≠ print référence, pointeur, adresse / reference type = type objet / référence spéciale = null très utilisée, beaucoup de méthodes (exemple: length()), opérateur + this = référence spéciale, à l'objet courant (objet sur lequel a été appelée la méthode) l'appel de procédure est un exemple d'instruction et l'appel de fonction est un exemple d'expression ailleurs : int vI=12; fois2(vI); S.o.p(vI); ailleurs : Circle vC=new Circle(0,0,12); fois2(vC); S.o.p(vC.getDiameter()); V.4.2 Garbage Collector = ramasse-miettes, compteur de références, tâche de fond
|
Cours 2.2I. CompositionI.2 Relation entre objets ==> diagramme d'objets [**] (voir dessin) § I.3 ==> diagramme de classes [**] (voir dessin) § I.4 Recopie, clonage simple (voir dessins) § I.5 Appel de constructeurs dans un constructeur : { return this.aNomAttribut; } protection ==> ne peut être modifié { this.aNomAttribut= pNomParamètre; } protection ==> tests de cohérence, maintenabilité { ... return valeurBooléenne; } 1.2) variable : vC1 ou pV1 ou aV1 1.3) new NomClasse() 1.4) appel de fonction : getRoueAv() 2.2) variable : (locale, attribut, paramètre) 2.3) constante : (locale, attribut, paramètre) déclarée comme suit : - private final int ATTRIBUT_CONSTANT = 10; - final int pNomParametre ==> reste constant pendant la méthode 2.5) OP1(expression_arithmétique) : - ou + 2.6) expression_arithmétique OP2 expression_arithmétique : + - * / % 3.2) variable : (locale, attribut, paramètre) 3.3) constante : (locale, attribut, paramètre) déclarée comme suit : - private final boolean ATTRIBUT_CONSTANT = true; : rarement utile - final boolean pNomParametre ==> reste constant pendant la méthode 3.5) résultat d'une comparaison avec : < > <= >= == != 3.6) OP1(expression_booléenne) : ! → NON 3.7) expression_booléenne OP2 expression_booléenne : && → ET ou || → OU 3.8) évaluation paresseuse : s'arrête dès qu'on peut déterminer le résultat (faux avec ET, vrai avec OU) ==> non commutatif (mais même résultat) IV.3 une instruction sans {} ==> danger ! (en cas d'ajout ou d'imbrication) IV.4 if successifs non indépendants - amélioration 1 : ajouter 2 else - amélioration 2 : supprimer le 3ème if et ainsi de suite jusqu'au cas terminal : N vaut 1. Dans ce cas, inutile de rappeler {AfficherLes 0 *} ! V.4 Élégant mais pas le plus efficace ni en temps ni en mémoire. Répéter des instructions efficacement ==> boucle (voir cours suivant) V.5 Exercice : écrire la fonction factorielle en utilisant la récursivité.
|
TP 2
|
Cours 3Lire la page division entière (voir cours 2.2 ci-dessus)I. Les boucles I.1.3 Caractéristiques : - test au début ⇒ peut tourner 0 fois - pb d'initialisation de l'expression booléenne - pb de modification de l'expression booléenne - comme pour le if, toujours mettre des { } II.2 type "réel" = sous-ensemble de D et non R ⇒ précision limitée ⇒ nombres à virgule flottante. exemple : bien que max=1022, 1234567 n'est pas représentable si 6 ch.sig. ligne réelle (voir dessin) II.4 Représentation binaire : beaucoup plus complexe : voir représentation des nombres réels et pour encore plus d'explications lire floating point numbers somme d'inverses de puissances de deux différentes ⇒ 5.1 non exact et calculs non exacts. deuxième forme = ±entierE±entier | première formeE±entier exemples : 0.5 -4. .32 (=0,32) 1E-6 (=10-6) 2.5E12 (=2,5x10-12) II.6.2 binaires : + - * / % % = définition du modulo étendue aux réels : toujours la relation a = b × q + r mais avec q toujours entier abs, sin, cos, tan, log, log10, exp, pow, ... voir syntaxe d'appel ci-dessous (III.1) - <=, >=, ==, != : INTERDIT ! (problèmes de précision) - |x-y|<ε remplace x==y - encore mieux en tenant compte de l'ordre de grandeur : |(x-y)/y|<ε ou |x/y - 1|<ε Exemples : (int)3.14 → 3 (int)-3.14 → -3 Partie_entière(-3.14) → -4 - sans perte (car 31<52) : vR = (double)vE; (pour la division, nouvelle expression réelle) - en String : vS = new String(vR); ou vS = "" + vR; - possible String → double ou int Exemple : vR = Math.sqrt(vX); ne peuvent pas accéder aux attributs d'instance ! ⇒ ne peuvent pas appeler de méthodes d'instance (par contre une méthode non statique peut appeler une méthode statique) - On les déclare en ajoutant static après public - Si attribut d'instance aNbCercles, valeur dupliquée dans chaque cercle, et si le constructeur l'incrémente, vaut 1 dans tous les cercles ! - On a besoin d'un attribut partagé par tous les objets de la classe Cercle. - On les déclare en ajoutant static après private - static { instructions } à mettre en tête de classe, un peu l'équivalent pour la classe du constructeur pour l'objet : exécuté automatiquement une seule fois au chargement de la classe - mais même valeur dupliquée dans toutes les classes - ⇒ constante de classe : public static final int MAX = 10; (aucun risque)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - non traité (voir TP3) Lire le poly :
|
TP 3
|
Cours 4I. L'héritage (caractéristique des LOO)- différence avec "est composé de" (doit avoir un sens ==> technique de conception, pas de programmation) b) objets en mémoire c) code java (extends) I.4 Héritage unique entre classes (contrairement à C++, compensé par le mécanisme d' Interface) mais transitivité I.5 Ce qui est hérité (règle: la sous-classe hérite de la super-classe les attributs et les méthodes) I.6 Exemples d'utilisation et conversion (cast) : b) Transport t1 = new Transport(); t1.roule(); t1.vole(); c) Transport t2 = new Avion(); t2.roule(); t2.vole(); Avion a2 = (Avion)t2; a2.vole(); a2.roule(); d) Avion a3 = (Avion)t1; e) Résumé : a1 = t1; a1 = (Avion)t1; t1 = a1; Légende : erreur de compilation ou erreur à l'exécution ==> exception - TypeDérivé réfFille = (TypeDérivé)réfMère; - compilation: type statique/déclaré, exécution: type dynamique/constaté La redéfinition (sous-classe donc classe différente, même nom, paramètres identiques, type retourné compatible ==> identique ou sous-classe ) est différente de (contraire à) la surcharge (même classe, même nom, paramètres différents, peu importe le type retourné) b) Exemple : Dans Avion : void freine() { S.o.p( "Inverser les reacteurs" ); } t1.freine(); a1.freine(); t1 = a1; t1.freine(); (liaison dynamique) d) Si la méthode freine() de la classe Avion a besoin d'appeler la méthode freine() de la classe Transport pour éviter la duplication de code, il faut écrire super.freine(); et non pas simplement freine(); équivalent à this.freine(); qui provoquerait une récursion infinie. - 1ère version : public Avion( int pRo2, boolean pCo2, int pRe2 ) { this.aNbRoues=pRo2; this.aEstComplet=pCo2; this.aNbReacteurs=pRe2; } - 2ème version : public Avion( int pRo2, boolean pCo2, int pRe2 ) { super( pRo2, pCo2 ); this.aNbReacteurs=pRe2; } super(...); doit forcément être la 1ère instruction du constructeur. public Avion() { super(); } (forcément 1ère instruction, comme pour super();) ⇒ Règle générale : Tout appel de constructeur ne peut être écrit que comme première instruction d'un autre constructeur. Raison évidente : le constructeur doit porter le même nom que la classe ! - si ∃ dans Transport un constructeur sans paramètre, alors constructeur non obligatoire dans les sous-classes Inconvénient : toutes les classes du même paquetage peuvent aussi y accéder. ⇒ NON Avantage : sécurité maximale, accès ≠ modification. Inconvénient : on doit définir un accesseur, et éventuellement un modificateur. ⇒ OUI
b) déjà redéfinie dans toutes les classes du JDK c) à redéfinir dans toute nouvelle classe (si on veut pouvoir l'afficher) d) appelée automatiquement à chaque conversion en String et notamment dans un System.out.println( ); b) déjà redéfinie dans toutes les classes du JDK c) à redéfinir dans toute nouvelle classe (si on veut pouvoir faire des comparaisons) d) signature OBLIGATOIRE (pas equals( Avion pA ) sinon ce n'est pas une redéfinition) e) propriétés : 2) x.equals(x) retourne vrai (réflexivité) 3) x.equals(y)==y.equals(x) (symétrie) ==> x et y de même classe (appelée automatiquement par le GC avant la destruction de l'objet) b) déjà redéfinie dans les classes du JDK qui le nécessitent c) à redéfinir si nécessaire dans une nouvelle classe t2 instanceof Avion && t2 instanceof Transport && t2 instanceof Object == true null instanceof AnyClass retourne toujours false anyNonNullReference instanceof Object retourne toujours true Object <|-- ... |-- ... <|-- JComponent <|-- JTextComponent |-- ... |--- JEditorPane (editeur de texte) |--- JTextArea (zone multilignes) |--- JTextField (zone monoligne) Lire le poly :
|
TD 4
|
TP 4
|
Cours 5I. Types primitifsI.2 "Nouveaux" : I.2.B short (entier/16 bits, signé) I.2.C byte (entier/8 bits, signé) I.2.D char : - C/C++: même nom, mais 8 bits, signé, ASCII - JAVA: 16 bits, non signé, Unicode - mais Unicode ⊃ ASCII (128 premiers caractères) 0 < contrôles < * < espace < * < chiffres < * < majuscules < * < minuscules < * ≤ 127 < ascii_étendu ≤ 255 - constantes littérales 'a' ou '\t' ( 1 ≠ '1' ≠ "1" ) - pas d'opérateurs sauf conversion ←→ int - String s = "Bonjour"; char c = s.charAt(0); => c vaut 'B'
- manipulation en une seule entité (notamment passage de paramètre) - possibilité de faire des boucles (comment afficher tous les attributs d'un objet ?) - regroupement de données de même type, accessibles par leur rang, dont la taille est fixée à l'exécution, mais une fois pour toutes - considéré comme une classe => hérite d'Object => un tableau est un objet => référence - attribut public length = taille du tableau = nombre de cases ≠ nombre d'éléments utiles (et ne pas confondre avec la méthode length() de la classe String) - T est n'importe quel type, primitif ou objet, y compris tableau - déclaré mais pas créé => 0 cases mémoire - taille est une expression entière positive (pas long), sinon NegativeArraySizeException - pour les variables locales, souvent en une seule fois : T[] vTab = new T[taille]; - expression entière (pas long) entre 0 et aTab.length-1, sinon ArrayIndexOutOfBoundsException ! (gros avantage sur C/C++) - 1ère valeur = aTab[0], ou aTab[2*i-1] = -x/2; - type objet : Classe var = new Classe( valeurs );, exemples: Point p = new Point(2,4); - classe particulière : String s = new String( "Bonjour" ); peut être abrégée en String s = "Bonjour"; - Tableau (syntaxe particulière) : int[] t = new int[] {10,20,30}; peut être abrégée en int[] t = {10,20,30}; uniquement dans une initialisation - Exemple : int[] nbJours = {31, 28, 31, ..., 30, 31}; remplace les 13 lignes int[] nbJours = new int[12]; nbJours[0] = 31; nbJours[1] = 28; ... nbJours[11] = 31; II.9 fonctionnements non souhaités : == ne compare pas les valeurs final ne protège pas les valeurs - void fill(tab,val) remplit toutes les valeurs de tab avec val - String toString(tab) retourne "[10, 20, 30]" - boolean equals(tab1,tab2) compare les tailles et les valeurs des 2 tableaux - void sort(tab) trie les valeurs de tab - int binarySearch(tab,val) retourne l'indice de val trouvée dans tab - mais String s = new String(tc); et tc = s.toCharArray(); - car String ne peut être modifiée alors que char[] si ! II.12.b int[][] bidim = new int[3][2]; ==> nouveau type ( int[][] ) et 2 indices. bidim[ligne][colonne] pour accéder à une case. int[][] peut être vu comme un tableau de int[] (puisque X[] est un tableau de X) Attention ! new int[3][2] ne signifie pas un tableau de 2 int[3] mais un tableau de 3 int[2] ! II.12.c initialisation possible : int[][] bidim = { {11, 12}, {21, 22}, {31, 32} }; II.12.d Un tableau peut avoir plus de 2 dimensions, et même plus de 5 ! Exemple :
while ( expression booléenne ) { instructions à répéter} III.2 Nouvelle : la boucle POUR initialisation: type_entier variable = expression_entière par exemple: int i=0 condition de continuation: comparaison sur la variable par exemple: i <= 15 progression: modification de la variable par exemple: i = i + 1 par exemple: for ( int i=0; i<=15; i=i+1 ) { instructions } Attention ! Seul cas en Java où le caractère ; ne termine pas une instruction.
- intérêt : instructions toujours exécutées au moins une fois avant le test de continuation - nombre de tours inconnu a priori - test au début, peut tourner 0 fois - pb d'initialisation de l'expression booléenne - pb de modification de l'expression booléenne
- nombre de tours calculable a priori - test au début, peut tourner 0 fois - les 2 pbs de la boucle while sont traités - il est fortement conseillé d'inclure la déclaration de variable dans l'instruction d'initialisation pour que la variable reste locale - équivalente à : instruction d'initialisation; while ( condition de continuation ) { instructions à répéter instruction de progression; } le nb de tours peut-il être connu à l'avance ? - si OUI, c'est une boucle for - si NON, seconde question à se poser : l'instruction dans la boucle doit-elle être exécutée au moins une fois ? - si OUI, c'est une boucle do while - si NON, c'est une boucle while Lire le poly :
|
TP 5
|
Cours 6I. AbstractionI.1.b interdire l'instanciation, mais laisser en commun ce qui doit l'être; classe prévue pour être dérivée I.1.c constructeurs : utiles pour initialiser les attributs communs; appelés par super(...); I.1.d syntaxe: abstract (public abstract class NomClasse ...) I.2.b redéfinition obligatoire dans toutes les sous-classes (sinon elles seront abstraites) ==> ne concerne pas les constructeurs, private interdit, @Override . Garantit une cohérence, un contrat avec les sous-classes, y compris les futures ==> extensibilité. I.2.c syntaxe: abstract et ; au lieu de {} (public abstract void nomMethode( ) ; ) I.2.d Si dans une classe il existe une méthode abstraite (non redéfinie), cette classe est abstraite (==> abstract) car objet.methode() doit toujours pouvoir marcher si objet a pu être instancié I.2.e draw() peut quand-même appeler drawSpec() grâce à la liaison dynamique ==> utilisation de classes non encore écrites ==> garantie d'extensibilité I.2.f Il est évident qu'une classe non abstraite peut hériter d'une classe abstraite, mais il est aussi possible qu'une classe abstraite hérite d'une classe non abstraite. I.2.g Dans le JDK : implémentations partielles I.3.b 100% des méthodes public abstract ==> 2 mots inutiles, et pas de constructeurs I.3.c 100% des attributs public static final ==> 3 mots inutiles I.3.d 100% des méthodes à I.3.e syntaxe: interface au lieu de abstract class , implements au lieu de extends , une classe peut implémenter plusieurs interfaces (séparées par des virgules) ==> implémenter toutes les méthodes de toutes les interfaces ! I.3.f exemple d'interfaces: Comparable ==> compareTo() DBShape implements Comparable, Drawable Circle extends DBShape Rosace implements Drawable I.3.h classe anonyme: 2) bouton.addActionListener( myButtonListener ); ==> myButtonListener est une instance d'une classe contenant actionPerformed() 3) bouton.addActionListener( new ActionListener() { public void actionPerformed() { instructions } } ); ==> rien de plus ! (classe anonyme) héritage multiple ! ==> interface sousI extends superI1, superI2 I.3.j véritable type ==> l'opérateur instanceof fonctionne; comme pour une super-classe (abstraite ou non) : réfObjet instanceof ClasseOuInterface II.2 Essayer la classe de démonstration et la comprendre II.3 Hiérarchie des exceptions du paquetage java.lang II.4 Tutoriel (en anglais)
|
TD 6
|
TP 6
|
Cours 7version définitive à venir ...Lire ce résumé de cours Lire le poly :
|
TP 7
|
Cours 8I. Fichiers de texteMais il faudra probablement importer au moins une classe d'exception, la plus générale étant import java.io.IOException;. Scanner sr; (sr est le nom de la variable) La déclaration précédente ne fait que déclarer une variable, sans l'initialiser. L'ouverture d'un fichier consiste à associer un fichier sur disque à une variable du programme : sr = new Scanner( new File( nom_fichier ) ); où nom_fichier est une chaîne de caractères (constante ou variable) contenant le chemin d'accès (absolu ou relatif) au fichier disque. 2) Rappels sur les chemins d'accès (sous Linux)
Tant que le fichier est ouvert en lecture, les accès en écriture sont refusés à tout autre programme. I.1.d Test d'ouverture
FileNotFoundException ou plus généralement IOException. I.1.e Opérations de lecture
Selon les systèmes, lire au-delà de cette limite peut soit provoquer une erreur, soit simplement retourner toujours la même donnée. Il faut donc tester la fin de fichier AVANT chaque lecture (eh oui, le fichier peut être vide !) :
Il faut donc le fermer le plus tôt possible, c'est-à-dire dès qu'on n'en a plus besoin par l'instruction : sr.close(); Il est souvent judicieux de placer ces instructions dans une clause finally, en les faisant précéder d'un test tel que : if ( sr != null )
On peut envisager au moins 3 manières de le lire (les virgules montrent à l'affichage la séparation entre les lectures) :
pw = new PrintWriter( nom_fichier ); où nom_fichier est une chaîne de caractères (constante ou variable) contenant le chemin d'accès (absolu ou relatif) au fichier disque. 2) Conséquences Tant que le fichier est ouvert en écriture, les accès en lecture et en écriture sont refusés à tout autre programme. L'écriture commence par le début du fichier en écrasant toutes les données déjà présentes si le fichier existait.
IOException. I.2.e Opérations d'écriture
Il faut donc le fermer le plus tôt possible, c'est-à-dire dès qu'on n'en a plus besoin par l'instruction : pw.close(); Il est souvent judicieux de placer ces instructions dans une clause finally, en les faisant précéder d'un test tel que : if ( pw != null ) II. Applettes
extends JApplet extends Applet extends Panel => this.add( composant graphique ); II.3 Fichier html : exemple Obligatoire pour le lancement, BlueJ le crée automatiquement II.4 Méthodes
UneInterface obj = new UneInterface() { méthodes à implémenter }
this.setLayout( new XLayout() ); où X peut être Border, Grid, Flow, Card, GridBag, Group, Box, etc... Lire le poly :
|
TP 8
|
Dernière mise à jour :