103
Java La syntaxe Les aspects techniques [email protected] - Version du 22/10/13 mercredi 23 octobre 13

Java - notions de bases pour développeur

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Java - notions de bases pour développeur

JavaLa syntaxe

Les aspects techniques

[email protected] - Version du 22/10/13

mercredi 23 octobre 13

Page 2: Java - notions de bases pour développeur

Rapide historique

• 1995 : sortie de la première version

• Rachat de Sun par Oracle en 2009

• Langage issu des concepts objets

• Plus mature que C++, Smalltalk...

• Portable sur plateformes hétérogènes

• Principe de virtualisation de l’exécution

mercredi 23 octobre 13

Page 3: Java - notions de bases pour développeur

Différentes versions• 1996 : JDK 1.0 (211 classes)

• 1997 : JDK 1.1 (477 classes)

• 1998 : Java 2 (1 524 classes)

• J2ME : Mobile Edition

• J2SE : Reprise du Java “standard”

• J2EE : Enterprise Edition (serveur)

• 2000 : J2SE 1.3 (1 840 classes)

• 2002 : J2SE 1.4 (2 723 classes)

• 2004 : J2SE 5.0 (3 270 classes)

• 2006 : Java SE 6 (3 777 classes)

• 2011 : Java SE 7 (8 000 classes)mercredi 23 octobre 13

Page 4: Java - notions de bases pour développeur

Cycle de compilationd’un langage ‘classique’

Code sourcetoto.c

Code objettoto.o

Code exécutabletoto.exe

Compilateur Editeur de liens

•Fichier texte•Compatibilité si langage normé

•Fichier binaire•Compatibilité CPU

•Fichier binaire•Compatibilité OS

Liaison avec des bibliothèquesfaisant la liaison avec le système

mercredi 23 octobre 13

Page 5: Java - notions de bases pour développeur

Compilation/exécution en Java

Code sourceToto.java

BytecodeToto.class

Code interprétéou émulé

Compilateur Exécution par la JVM

•Fichier texte•Compatibilité totale(norme gérée par Sun)

•Fichier binaire•Compatibilité JVM

•Exécution directe enmémoire•Compatibilité OS

Liaison avec des bibliothèqueselles aussi en bytecode

mercredi 23 octobre 13

Page 6: Java - notions de bases pour développeur

Caractéristiques du langage (1)

• Hétérogène

• Peut s’exécuter dans des environnements très divers

• Pas de problème de compatibilité

• Même au niveau des types

• Même au niveau de l’interface graphique

mercredi 23 octobre 13

Page 7: Java - notions de bases pour développeur

Caractéristiques du langage (2)

• Objet

• Bénéficie des retours d’expériences d’avant 95

• Ce n’est pas une adaptation d’un langage existant

• Tout est encapsulé dans des classes

• Simple

• La syntaxe est simplifiée et abordable

mercredi 23 octobre 13

Page 8: Java - notions de bases pour développeur

Caractéristiques du langage (3)

• Robuste

• La JVM détecte les erreurs et gère les éventuelles fuites mémoire

• Orienté réseau

• Gestion native des threads

• Protocoles réseaux inclus en standard

• Informatique distribuée

mercredi 23 octobre 13

Page 9: Java - notions de bases pour développeur

Caractéristiques du langage (4)

• (relativement) ouvert sur l’extérieur

• Les interfaces JNI permettent de faire passerelle avec les parties “natives” du système (matériel, réseau, OS...)

• Très typé Web

• J2EE fournit un serveur d’application complet pour le Web

• Tous les standards sont là : XML, Ajax...

mercredi 23 octobre 13

Page 10: Java - notions de bases pour développeur

Points faibles

• L’étape d’interprétation de la JVM entraine bien sûr une plus grande lenteur et lourdeur

• La syntaxe est simplifiée par rapport à d’autres langages (C++...)

• En revanche, certaines subtilités “techniques” ne sont pas possibles

mercredi 23 octobre 13

Page 11: Java - notions de bases pour développeur

Environnements de développement

• L’ex Leader : Borland JBuilder

• Aujourd’hui : Eclipse / IBM Rational App Dev

• Base OpenSource donnée par IBM

• Extensions par Plugins

• Plugins OpenSource ou IBM

• Chez Sun : NetBeans

mercredi 23 octobre 13

Page 12: Java - notions de bases pour développeur

Les commandes de base

• java : appel à la JVM

• javac : compilateur, produit des .class

• javap : désassembleur

• javadoc : génère la documentation

• jar : gestion des Java ARchives

mercredi 23 octobre 13

Page 13: Java - notions de bases pour développeur

Compilation manuelle

• Vérifier la présence des variables d’environnement :

• JAVA_HOME : pointe sur le JDK

• PATH : doit intégrer $JAVA_HOME/bin

• CLASSPATH : doit intégrer $JAVA_HOME/lib ainsi que vos propres librairies (répertoires et .jar)

mercredi 23 octobre 13

Page 14: Java - notions de bases pour développeur

My first class• Et c’est parti ! Dans un fichier texte Essai.java, on

tape :

public class Essai{ public static void main(String args[]) { System.out.println(“Goodbye cruel world !”); }}

http://fr.wikipedia.org/wiki/Hello_world

mercredi 23 octobre 13

Page 15: Java - notions de bases pour développeur

Utilisation de base des commandes

• javac Essai.java

• Compile notre fichier Essai.java

• On obtient un fichier Essai.class

• java Essai

• Lance la classe contenue dans Essai.class

mercredi 23 octobre 13

Page 16: Java - notions de bases pour développeur

Notion de packages• Les classes sont organisées en packages,

afin de les organiser

• Les packages sont des répertoires

• On prend souvent le nom de domaine de la société pour garantir un nom unique

• Dans le code, un package est représenté sous la forme :

package fr.olek.cours.debutant;

mercredi 23 octobre 13

Page 17: Java - notions de bases pour développeur

Déclaration d’une classe dans un package

package fr.olek.cours.repondeur;

public class Repondeur{ ...} Le fichier se trouve dans :

/fr/ecoms/cours/repondeur/

mercredi 23 octobre 13

Page 18: Java - notions de bases pour développeur

Appel d’une classe dans un package

• La syntaxe est plutôt lourde :

public class Essai{ public static void main(String args[]) { fr.olek.cours.repondeur.Repondeur r= new fr.olek.cours.repondeur.Repondeur(); }}

mercredi 23 octobre 13

Page 19: Java - notions de bases pour développeur

Utilisation de la clause import

• Il vaut mieux l’importer :

import fr.olek.cours.repondeur.Repondeur;

public class Essai{ public static void main(String args[]) { Repondeur r=new Repondeur(); }}

mercredi 23 octobre 13

Page 20: Java - notions de bases pour développeur

Divers usages d’import• import n’importe pas “physiquement” les packages

mentionnés

• Simple indication à la JVM pour savoir où trouver les classes utilisées

• Il est possible d’importer toutes les classes d’un package d’un coup :

import fr.olek.cours.repondeur.*;

• Attention, ça n’inclue pas les sous-packages !

import fr.olek.*; // ne va pas importer “Repondeur”mercredi 23 octobre 13

Page 21: Java - notions de bases pour développeur

Régler les ambiguités

• Dans certains cas, des classes portent le même nom, dans des packages différents

import java.awt.*; // contient une classe “Point”import fr.olek.geometrie.Point;...Point p=new Point(); // on utilise le nôtre

mercredi 23 octobre 13

Page 22: Java - notions de bases pour développeur

Imports statiques• Nouveauté de Java 5.0

• Permet d’éviter la syntaxe classe.méthode ou classe.attribut

• Exemple :

import static java.lang.Math;...

aire=rayon*java.lang.Math.PI;

aire=rayon*Math.PI;aire=rayon*PI;

mercredi 23 octobre 13

Page 23: Java - notions de bases pour développeur

Les commentaires• Pour commenter une seule ligne :

// Ligne de commentaire

• Bloc de commentaire :

/* Début de bloc....Blabliblu */

• Bloc de commentaire de documentation

/** Début de bloc....Blabliblu */

mercredi 23 octobre 13

Page 24: Java - notions de bases pour développeur

Les types de données• On les appelle “types scalaires”

• 3 grands types :

• Numériques

• Entiers

• Réels

• Booléens

• Caractères

mercredi 23 octobre 13

Page 25: Java - notions de bases pour développeur

Les types numériques

• Ils sont tous complètement normalisés !

• Quelque soit la plateforme, un même type aura toujours la même représentation

• Les entiers sont par défaut signés

• long et short sont des types à part entière

mercredi 23 octobre 13

Page 26: Java - notions de bases pour développeur

Les différents types numériques disponibles

• Par défaut, les nombres sont de type int

• Les suffixes permettent de forcer un type : 1234L

Type Taille mémoire

byte 1 octet

short 2 octets

int 4 octets

long 8 octets

mercredi 23 octobre 13

Page 27: Java - notions de bases pour développeur

Types réels

• Contrairement à C/C++, il existe une vraie arithmétique en float

• Par défaut, un nombre à virgule est un double

• Suffixe pour un float : 12.24F

Type Taille mémoire

float 4 octets

double 8 octets

mercredi 23 octobre 13

Page 28: Java - notions de bases pour développeur

Type booléen• Fini les réprésentations via des entiers 0 et 1

(ou 0 et -1, ou 1 et 2...)

• Java propose un type boolean à part entière

• 2 constantes particulières

• true

• false

• boolean est le seul type utilisé pour les tests

• Toute expression de test est donc booléenne

mercredi 23 octobre 13

Page 29: Java - notions de bases pour développeur

Exemple de test booléen

if(a==b) ....

• Pour tester un booléen :

boolean flag=false;...if(flag==true)

if(flag)

Expression booléenne

Expression redondante

if(flag==false)

if(!flag)

mercredi 23 octobre 13

Page 30: Java - notions de bases pour développeur

Conditionsif(expression) instruction1;else instruction2;instruction3;

if(expression1) instruction1;else if(expression2) instruction2;else if(expression3) instruction3;else instruction4;

•Chaque expression est booléenne•Chaque instruction peut être remplacée par un bloc : {

instruction 1; ... instruction n;}

mercredi 23 octobre 13

Page 31: Java - notions de bases pour développeur

Choix multiplesint choix;switch(choix){ case 1: i=3; break; case 2: case 3: i=4; break; default: i=3;}

Ordre de débranchement

Exécuté si choix=2 ou 3

Choix par défaut

Exécuté si choix=1 switch/case ne marche qu’avecdes types scalaires !(=>pas de String)

mercredi 23 octobre 13

Page 32: Java - notions de bases pour développeur

Boucles• La boucle type en Java est while :

while(condition){ instruction1;}

do{ instruction1;} while(condition)Exécuté au

moins une fois

mercredi 23 octobre 13

Page 33: Java - notions de bases pour développeur

Boucle for• Héritée du langage C

• En fait, un condensé d’une boucle while avec incrémentation

for(exp_init; exp_test; exp_maj){ instruction1;}

exp_init;while(exp_test){ instruction1; exp_maj;}

for(int i=0;i<10;i++) ...Exemple :mercredi 23 octobre 13

Page 34: Java - notions de bases pour développeur

Caractères

• Particularité de Java : tout caractère est au format UNICODE sur 16 bits

• Saisie d’une constante caractère :

char c1=’A’; // Caractère en dur char c2=’\t’; // Séquence d’échappement classique du C char c3=’\060’; // Exactement 3 chiffres en octal char c4=’\u0030’; // Exactement 4 chiffres en hexadécimal // pour une constante UNICODE

• Attention aux caractères Français accentués • Unicode conseillé...

char eacute=’\u00E9’; // le caractère « é »

• char est de toute manière peu utilisé• On préférera utiliser la classe String

mercredi 23 octobre 13

Page 35: Java - notions de bases pour développeur

Chaîne de caractères

• Fini les bidouilles de tableau de caractères

• On utilise une classe à part entière

String s=new String(“bonjour les amis”);

• ou plutôt :

String s=”bonjour les amis”;

mercredi 23 octobre 13

Page 36: Java - notions de bases pour développeur

ConcaténationString nom=”Paul”;String phrase=”Bonjour,”+nom+”, comment va ?”;

• On peut également concaténer des éléments autres que “String”

• Ils seront automatiquement convertis

int age=10;String phrase=”Tu as “+age+” ans”;

mercredi 23 octobre 13

Page 37: Java - notions de bases pour développeur

Concaténation par buffer

• La concaténation classique de String implique une reconstruction systématique

String s=”Bonjour”;s=s+” les amis”; // s est une nouvelle instance

• La classe StringBuffer résoud ce problème d’efficacité

StringBuffer sb=new StringBuffer();sb.append(“Bonjour”);sb.append(“ les amis”);String s=sb.toString();

mercredi 23 octobre 13

Page 38: Java - notions de bases pour développeur

Comparaison de chaînes de caractères• La comparaison directe va comparer les

pointeurs, pas le contenu :

if(s1==s2) ...

• La comparaison de contenu nécessite l’utilisation de la méthode equals() :

if(s1.equals(s2)) ...

mercredi 23 octobre 13

Page 39: Java - notions de bases pour développeur

Intérêt d’une classe

• Rappel : une classe =

• des informations (attributs)

• des actions pour manipuler ces informations (méthodes)

• Ici, chaque instance de String rassemble :

• La chaîne de caractères

• De quoi retravailler cette chaîne

mercredi 23 octobre 13

Page 40: Java - notions de bases pour développeur

Encapsulation dans une chaîne de caractères

Avant :La chaîne :char[50]Les outils :(répartis dans diverses librairies)strcmpstrstrstrpos...

String

chaine

substr(int,int)size()equals(String)...

Après :

mercredi 23 octobre 13

Page 41: Java - notions de bases pour développeur

Méthode vs Fonction

• Taille d’une chaîne en PHP via la fonction strlen :

$taille=strlen($chaine);

• Equivalent en Java :

int taille=chaine.length();

Une donnée encapsulant ses outils

Un outil auquel on fournit la donnée

mercredi 23 octobre 13

Page 42: Java - notions de bases pour développeur

Méthodes utiles de String

trim() Supprime les espaces

toLowerCase() Force en minuscules

toUpperCase() Force en majuscule

subString(int,int) Retourne une sous-chaîne

indexOf(String) Retourne la position d’une sous chaine

charAt(int) Renvoie le caractère à la position donnée

length() Renvoie la longueur de chaîne

... ...

mercredi 23 octobre 13

Page 43: Java - notions de bases pour développeur

Utilisation de la Javadoc

mercredi 23 octobre 13

Page 44: Java - notions de bases pour développeur

Utilisation de la Javadoc

临河而羡鱼,不如归家织网

mercredi 23 octobre 13

Page 45: Java - notions de bases pour développeur

Utilisation de la Javadoc

临河而羡鱼,不如归家织网Si tu donnes un poisson à un homme, il mangera un jour.

Si tu lui apprend à pêcher, il mangera toujours. 

mercredi 23 octobre 13

Page 46: Java - notions de bases pour développeur

Liste des packages

Liste des classes

Index des méthodes

Héritage

Package

mercredi 23 octobre 13

Page 47: Java - notions de bases pour développeur

Regarder le type de sortie pour choisir une bonne

méthode

Méthode statique

Clic pour voir le détail

mercredi 23 octobre 13

Page 48: Java - notions de bases pour développeur

Transtypage / Casting

• Le transtypage permet de gérer les conversions d’un type à un autre

• Différents cas se présentent :

• D’un type scalaire à un autre

• D’une classe à une autre

• Entre classes et types scalaires

mercredi 23 octobre 13

Page 49: Java - notions de bases pour développeur

Casting entre types scalaires

• Tout est possible, mais attention aux pertes de précision

int i=10;double d=10.1;d=i; // interditd=(double)i; // autoriséi=(int)d; // autorisé, mais perte de précision

mercredi 23 octobre 13

Page 50: Java - notions de bases pour développeur

Perte de précisions dans les calculs

• Exemple :

int i=4;int j=3;double result=i/j;

• Pour limiter la perte, il faut :

double result=i/(double)j;oudouble result=(double)i/j;

int / double est un double

i/j est une expression donnant un entier

mercredi 23 octobre 13

Page 51: Java - notions de bases pour développeur

Cast entre classes : downcasting

Livre livre=new Livre(...);Produit prod;prod=(Produit) livre; // autoriséprod=livre; // autorisé, car un livre EST un produit

mercredi 23 octobre 13

Page 52: Java - notions de bases pour développeur

Cast entre classes : upcasting

Produit prod=new Livre(...); // autorisé (downcast)Livre livre;livre=prod; // interditlivre=(Livre)prod; // autorisé, mais risqué

mercredi 23 octobre 13

Page 53: Java - notions de bases pour développeur

Cast entre classes et types scalaires

• Ex : passer un String en int, ou inversement

• Ce n’est pas possible directement

• Deux notions totalement différentes

• On passe par un intermédiaire

• Les class wrappers (enrobeurs)

mercredi 23 octobre 13

Page 54: Java - notions de bases pour développeur

Les class Wrappers

• Ce sont des classes encapsulant des types scalaires

• Ex : Integer iWrap=new Integer(12);

• Permet de faire bénéficier ses types scalaires des atouts d’une classe :

• Fournir la donnée avec ses outils

mercredi 23 octobre 13

Page 55: Java - notions de bases pour développeur

Class Wrappers disponibles

Type primitif Wrapper

boolean Boolean

byte Byte

double Double

short Short

int Integer

long Long

float Float

char Character

mercredi 23 octobre 13

Page 56: Java - notions de bases pour développeur

Conversion d’un String en int

Javadoc du class Wrap Integer :

String s=”12”;Integer iWrap=new Integer(s);

int val=iWrap.intValue();

mercredi 23 octobre 13

Page 57: Java - notions de bases pour développeur

Conversion String/int avec une méthode statique

Javadoc du class Wrap Integer :

String s=”12”;int val=Integer.parseInt(s);

Syntaxe classe.méthode()

mercredi 23 octobre 13

Page 58: Java - notions de bases pour développeur

Conversion int en String• On utilise encore le classwrap Integer :

int val=12;Integer iWrap=new Integer(val);String s=iWrap.toString();

• Il existe aussi une méthode statique dans String :

String s=String.valueOf(val);

• Autre méthode, plus “douteuse” :

String s=””+val;

mercredi 23 octobre 13

Page 59: Java - notions de bases pour développeur

Autoboxing de Java5• Dans certains cas, l’encapsulation de types

dans des classwrap est automatique en Java>5

• Exemple :

Avant :List l=new ArrayList();int val=100;l.add(new Integer(val));

Après :List l=new ArrayList<Integer>();int val=100;l.add(val);

Conversion implicite

mercredi 23 octobre 13

Page 60: Java - notions de bases pour développeur

Listes dynamiques

• Classes héritant de la structure List :

• ArrayList : redimensionnement auto d’un tableau

• LinkedList : véritable liste chaînée

• Chaque classe a ses atouts en termes d’efficacité

• Mais l’utilisation est la même

mercredi 23 octobre 13

Page 61: Java - notions de bases pour développeur

Exploitation d’une liste

• Création :

ArrayList liste=new ArrayList();

• Remplissage :

liste.add(element);

• Récupération d’un élément :

Voiture v=(Voiture)liste.get(i);

mercredi 23 octobre 13

Page 62: Java - notions de bases pour développeur

Typage de listes en Java >5

• Avant : upcasting risqué

Voiture v=(Voiture)liste.get(i);

• Après : listes typées et typage implicite

ArrayList<Voiture> liste=new ArrayList<Voiture>();...Voiture v=liste.get(i);

mercredi 23 octobre 13

Page 63: Java - notions de bases pour développeur

Parcours de liste par boucle for

ArrayList<Voiture> liste=new ArrayList<Voiture>();...for(int i=0;i<liste.size();i++){ Voiture v=liste.get(i); ...}

size() détermine le nb d’éléments

mercredi 23 octobre 13

Page 64: Java - notions de bases pour développeur

Parcours de liste par itérateur

ArrayList<Voiture> liste=new ArrayList<Voiture>();...Iterator<Voiture> it=liste.iterator();while(it.hasNext()){ Voiture v=it.next(); ...}

mercredi 23 octobre 13

Page 65: Java - notions de bases pour développeur

Parcours de liste par itérateur implicite (Java5)ArrayList<Voiture> liste=new ArrayList<Voiture>();...for(Voiture v: liste){ v.accelere(); ...}

Il s’agit en fait d’un «foreach»

mercredi 23 octobre 13

Page 66: Java - notions de bases pour développeur

Expression d’une instance en String

• Par défaut, Java ne sait pas comment “afficher” une instance

Voiture v=new Voiture();System.out.println(v);

➡Voiture@2a18bdf

• Cet affichage est en fait effectué par une méthode toString() de la classe Object

• Rappel : toutes les classes héritent d’Object

mercredi 23 octobre 13

Page 67: Java - notions de bases pour développeur

Surcharge de toString()• Surcharger cette méthode permet de

personnaliser l’affichage de l’instancepublic class Voiture{ ... public String toString() { return “Je suis la voiture “ +this.nom; }}

Voiture v=new Voiture();System.out.println(v);

➡Je suis la voiture XXXmercredi 23 octobre 13

Page 68: Java - notions de bases pour développeur

Intérêts de la méthode toString()

• Le concept d’instance “autodescriptive” est très intéressant pour le debug

• Il est possible d’utiliser des appels à toString() en cascade :

• Ex : ArrayList possède une méthode toString() qui va appeler le toString() de chacun de ses éléments

mercredi 23 octobre 13

Page 69: Java - notions de bases pour développeur

Exceptions

• Une exception représente soit :

• Une erreur (système)

• Une erreur (de votre application)

• Un cas alternatif

mercredi 23 octobre 13

Page 70: Java - notions de bases pour développeur

Section de code critique

• Le code potentiellement source d’erreur sera encadré par un bloc try :

try{ FileReader f=new FileReader(“unfic.txt”);}

mercredi 23 octobre 13

Page 71: Java - notions de bases pour développeur

Capture des erreurs

• Chaque bloc try est suivi d’un ou plusieurs blocs catch

• Si une erreur apparaît, l’exécution de try est stoppée, et le bloc catch apparaît à la place

mercredi 23 octobre 13

Page 72: Java - notions de bases pour développeur

Enchaînement try/catchtry{ ...}catch(IOException ioe){ .... gestion de l’erreur de type IO}catch(Exception e){ ... gestion des autres erreurs }

mercredi 23 octobre 13

Page 73: Java - notions de bases pour développeur

.......try{ ... instruction à problème .....}catch(IOException ioe){ .... gestion de l’erreur de type IO}......

mercredi 23 octobre 13

Page 74: Java - notions de bases pour développeur

.......try{ ... instruction à problème .....}catch(IOException ioe){ .... gestion de l’erreur de type IO}......

mercredi 23 octobre 13

Page 75: Java - notions de bases pour développeur

.......try{ ... instruction à problème .....}catch(IOException ioe){ .... gestion de l’erreur de type IO}......

mercredi 23 octobre 13

Page 76: Java - notions de bases pour développeur

.......try{ ... instruction à problème .....}catch(IOException ioe){ .... gestion de l’erreur de type IO}......

mercredi 23 octobre 13

Page 77: Java - notions de bases pour développeur

.......try{ ... instruction à problème .....}catch(IOException ioe){ .... gestion de l’erreur de type IO}......

mercredi 23 octobre 13

Page 78: Java - notions de bases pour développeur

.......try{ ... instruction à problème .....}catch(IOException ioe){ .... gestion de l’erreur de type IO}......

mercredi 23 octobre 13

Page 79: Java - notions de bases pour développeur

Que faire en cas d’erreur ?

• L’erreur peut se réparer localement ?

• On fait un try/catch

• L’erreur est grave, il faut sortir de la méthode

• On relance l’exception via un throws

mercredi 23 octobre 13

Page 80: Java - notions de bases pour développeur

Avant la remontée d’erreurvoid uneMethode()

{ .... instructionAProbleme ...} {

.... inst.uneMethode(); ...}

mercredi 23 octobre 13

Page 81: Java - notions de bases pour développeur

Remontée d’erreurvoid uneMethode() throws IOException{ .... instructionAProbleme ...}

{ .... try { inst.uneMethode(); } catch(IOException ioe) { ... } ...}

Cet appel est devenu section de code critique

mercredi 23 octobre 13

Page 82: Java - notions de bases pour développeur

Différentes exceptions • Celles héritant de Exception

• “checked exceptions”, les plus connues

• Celles héritant de Error

• Erreurs système graves

• Celles héritant de RuntimeException

• “unchecked exceptions”, n’obligeant pas un try/catch pour les gérer

mercredi 23 octobre 13

Page 83: Java - notions de bases pour développeur

Le bloc finally• Est exécuté qu’il y

aie une erreur ou non

• Finalement presque identique au bloc de données après le catch

• Mais est exécuté même en cas de sortie anticipée de la fonction

try{ .....}catch(Exception e){ .... ; return;}finally{.. // est exécuté avant le return}

mercredi 23 octobre 13

Page 84: Java - notions de bases pour développeur

Générer ses propres exceptions

1) Définir l’exception

• Il s’agit d’une classe héritant de Exceptionpublic class QINegatifException extends Exception{ public QINegatifException(String nom) { super(“Attention, “+nom+” a un QI d’huitre !”); }}

Appel constructeur classe

mère

mercredi 23 octobre 13

Page 85: Java - notions de bases pour développeur

Générer ses propres exceptions

2) Lancer l’exception

• Lorsque celà vous parait utile, vous lancez l’exception

{ ... if(qi<0) throw new QINegatifException(“bob”); ...}

mercredi 23 octobre 13

Page 86: Java - notions de bases pour développeur

Générer ses propres exceptions

3) Définir le code critique

• La méthode où vous avez lancé l’exception devient section de code critique

void ajoutLofteur(Lofteur l) throws QINegatifException{ ... if(l.getQi()<0) throw new QINegatifException(l.getNom()); ...}

Ne pas confondre avec throw (sans S)

mercredi 23 octobre 13

Page 87: Java - notions de bases pour développeur

Générer ses propres exceptions

4) Lever l’exception

• On gère l’appel au code critique comme à l’accoutumée

try{ ... loft.ajoutLofteur(l); ...}catch(QINegatifException qie) { ... }

L’utilisateur de la classe est obligé par le

compilateur de gérer l’exception ‘proprement’

mercredi 23 octobre 13

Page 88: Java - notions de bases pour développeur

Comment gérer l’erreur ?

• Le plus souvent, on se contente d’afficher l’erreur

• System.err.println(e.getMessage());

• e.printStackTrace();

• Autant que possible, effectuer un traitement adéquat

• Le plus souvent, tout ce joue dans ce qu’on va mettre dans le try / en dehors du try

mercredi 23 octobre 13

Page 89: Java - notions de bases pour développeur

Lire un fichier de propriétés

• La plupart des applis Java stockent leurs paramètres dans un fichier texte de type : machin.properties

• Il existe une petite classe permettant de faciliter l’accès à ces propriétés

mercredi 23 octobre 13

Page 90: Java - notions de bases pour développeur

Utilisation de la classe Properties

import java.util.Properties; Properties prop = new Properties(); // Lecture du fichier contenant les données de configuration FileInputStream in = new FileInputStream("monappli.properties"); prop.load(in); in.close(); // Extraction des propriétés String url = prop.getProperty("monappli.url"); String user = prop.getProperty("monappli.chemin");

monappli.url=http://www.olek.frmonappli.chemin=/usr/local/appli

Fichier monappli.properties

mercredi 23 octobre 13

Page 91: Java - notions de bases pour développeur

Marshalling XML• Objectif : sauvegarder une trace de ses

données sous forme d’un fichier XML

• Exemple : fichier de configuration

• On peut utiliser :

• Des outils complets de marshalling (CastorXML, par ex)

• Les classes standards de Java

• XStream (http://xstream.codehaus.org)

mercredi 23 octobre 13

Page 92: Java - notions de bases pour développeur

Avec Java standard

• Depuis la v1.4, on dispose de classes XMLEncoder et XMLDecoder

• Usage : XMLEncoder e = new XMLEncoder( new BufferedOutputStream( new FileOutputStream("Test.xml"))); e.writeObject(instanceASerialiser); e.close();

mercredi 23 octobre 13

Page 93: Java - notions de bases pour développeur

Limitation de ces classes

• Utilisation impérative de beans (constructeur sans paramètre et get/set systématiques)

• Code XML généré lourd

• On voit les objets ArrayList, etc...

• A réserver à l’archivage de petites classes isolées

• Par ex, classe de configuration

mercredi 23 octobre 13

Page 94: Java - notions de bases pour développeur

Avec XStreamXStream xstream = new XStream(new DomDriver());

// écriture du XML à partir d’une instance de classexstream.toXML(inst, new BufferedOutputStream( new FileOutputStream("Test.xml")));

// lecture du XML et récupération de l’instanceMaClasse inst=(MaClasse) xstream.fromXML(new BufferedInputStream( new FileInputStream("Test.xml")));

• On peut également gérer des “mappings” permettant de préciser les noms utilisés au final dans le XML

mercredi 23 octobre 13

Page 95: Java - notions de bases pour développeur

Sérialisation• Va prendre une “image “ d’une instance

telle qu’elle est présente en mémoire

• Et la transforme en suite d’octets que l’on peut manipuler directement

• Pour transfert via le réseau

• Pour stockage dans un fichier ou une base (dans un blob)

mercredi 23 octobre 13

Page 96: Java - notions de bases pour développeur

Mise en place• Les classes à stocker doivent implémenter

l’interface Serializable

• Cette interface est vide, aucune méthode à implémenter

• Elle joue simplement le rôle de marqueur

• On utilise ensuite les outils ObjectOutputStream et ObjectInputStream

mercredi 23 octobre 13

Page 97: Java - notions de bases pour développeur

ObjectOutputStream

• Exemple de stockage dans un fichier :! FileOutputStream fos = new FileOutputStream("t.tmp");! ObjectOutputStream oos = new ObjectOutputStream(fos);

! oos.writeObject(moninstance);

! oos.close(); fos.close();

mercredi 23 octobre 13

Page 98: Java - notions de bases pour développeur

ObjectInputStream

• Relecture de l’objet à partir du fichier! FileInputStream fis = new FileInputStream("t.tmp");! ObjectInputStream ois = new ObjectInputStream(fis);

! MaClasse instanceRecup=(MaClasse)ois.readObject();

! oos.close(); fos.close();

mercredi 23 octobre 13

Page 99: Java - notions de bases pour développeur

Qu’est ce qui est sérialisé ?

• Données ET méthodes

• Vraie encapsulation

• Sérialisation en cascade

• Si des attributs pointent vers d’autres objets, ils sont sérialisés (même les listes)

• Pour ignorer un attribut : transient

mercredi 23 octobre 13

Page 100: Java - notions de bases pour développeur

Gestion des logs

• Objectif : remplacer les bêtes “println” qui parsement nos programmes

• Pourquoi ?

• Pouvoir les rediriger où l’on veut (fichier...)

• Gérer différents niveaux d’affichage

• Debug, erreurs...

mercredi 23 octobre 13

Page 101: Java - notions de bases pour développeur

L’outil Log4J d’Apache• Autre possibilité : java.util.logging

• Permet la gestion de différents niveaux d’erreur

• DEBUG >WARN>INFO>ERROR

• Ainsi que le reroutage sur divers périphériques

• CONSOLE, LOGFILE...

• Possibilité de gérer des roulements de fichiers

mercredi 23 octobre 13

Page 102: Java - notions de bases pour développeur

Utilisation de Log4J // récup du fichier de configuration PropertyConfigurator.configure("log4j.properties"); //initialisation du Logger Logger log=Logger.getLogger(Essai.class); // émission de messages log.debug("debug!!"); log.warn("warn !"); log.fatal("fatal !"); log.info("info !");

mercredi 23 octobre 13

Page 103: Java - notions de bases pour développeur

Fichier de configuration

# Set root category priority to INFO and its only appender to CONSOLE.log4j.rootCategory=INFO, CONSOLE#log4j.rootCategory=INFO, CONSOLE, LOGFILE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.Threshold=INFOlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayoutlog4j.appender.CONSOLE.layout.ConversionPattern=[%t] %-5p %c - %m%n

mercredi 23 octobre 13