Java
La syntaxe
Les aspects techniques
jd@olek.fr - Version du 22/10/13

mercredi 23 octobre 13
Rapide historique
• 1995 : sortie de la première version
• Rachat de Sun par Oracle en 2009
• Langage issu des concepts ob...
Différentes versions
•
•
•

1996 : JDK 1.0 (211 classes)
1997 : JDK 1.1 (477 classes)
1998 : Java 2 (1 524 classes)

•
•
•...
Cycle de compilation
d’un langage ‘classique’
Compilateur
Code source
toto.c

Editeur de liens

Code objet
toto.o

•Fichie...
Compilation/exécution
en Java
Compilateur
Code source
Toto.java

•Fichier texte
•Compatibilité totale

(norme gérée par Su...
Caractéristiques du
langage (1)
• Hétérogène
• Peut s’exécuter dans des environnements
très divers

• Pas de problème de c...
Caractéristiques du
langage (2)

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

• Ce n’est pas une adaptation d’...
Caractéristiques du
langage (3)

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

• Orienté ...
Caractéristiques du
langage (4)

• (relativement) ouvert sur l’extérieur
• Les interfaces JNI permettent de faire

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

• La syntaxe es...
Environnements de
développement
• L’ex Leader : Borland JBuilder
• Aujourd’hui : Eclipse / IBM Rational App Dev
• Base Ope...
Les commandes de
base
• java : appel à la JVM
• javac : compilateur, produit des .class
• javap : désassembleur
• javadoc ...
Compilation manuelle
• Vérifier la présence des variables
d’environnement :

• JAVA_HOME : pointe sur le JDK
• PATH : doit ...
My first class
• Et c’est parti ! Dans un fichier texte Essai.java, on
tape :

public class Essai
{
public static void main(...
Utilisation de base des
commandes
• javac Essai.java
• Compile notre fichier Essai.java
• On obtient un fichier Essai.class
...
Notion de packages

• Les classes sont organisées en packages,
afin de les organiser

• Les packages sont des répertoires
•...
Déclaration d’une
classe dans un package
package fr.olek.cours.repondeur;
public class Repondeur
{
...
}
Le fichier se trou...
Appel d’une classe dans
un package
• La syntaxe est plutôt lourde :
public class Essai
{
public static void main(String ar...
Utilisation de la clause
import

• Il vaut mieux l’importer :

import fr.olek.cours.repondeur.Repondeur;
public class Essa...
Divers usages d’import

• import n’importe pas “physiquement” les packages
mentionnés

• Simple indication à la JVM pour s...
Régler les ambiguités
• Dans certains cas, des classes portent le même
nom, dans des packages différents

import java.awt....
Imports statiques

• Nouveauté de Java 5.0
• Permet d’éviter la syntaxe classe.méthode
ou classe.attribut

• Exemple :
imp...
Les commentaires

• Pour commenter une seule ligne :
// Ligne de commentaire

• Bloc de commentaire :
/* Début de bloc
......
Les types de données
• On les appelle “types scalaires”
• 3 grands types :
• Numériques
• Entiers
• Réels
• Booléens
• Car...
Les types numériques
• Ils sont tous complètement normalisés !
• Quelque soit la plateforme, un même
type aura toujours la...
Les différents types
numériques disponibles
Type Taille mémoire
byte

1 octet

short

2 octets

int

4 octets

long

8 oct...
Types réels
Type Taille mémoire
float

4 octets

double

8 octets

• Contrairement à C/C++, il existe une vraie
arithmétiqu...
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...
Exemple de test
booléen

Expression
booléenne

if(a==b) ....

• Pour tester un booléen :
boolean flag=false;
...
if(flag==tr...
Conditions
if(expression)
instruction1;
else
instruction2;
instruction3;

mercredi 23 octobre 13

•Chaque expression est b...
Choix multiples

int choix;
switch(choix)
{
case 1: Exécuté si choix=1
i=3;
break;
Ordre de débranchement
case 2:
case 3:
...
Boucles

• La boucle type en Java est while :
while(condition)
{
instruction1;
}
Exécuté au
moins une fois

mercredi 23 oc...
Boucle for

• Héritée du langage C
• En fait, un condensé d’une boucle while
avec incrémentation

for(exp_init;
exp_test;
...
Caractères
•
•
•
•

mercredi 23 octobre 13

Particularité de Java : tout caractère est au format
UNICODE sur 16 bits
Saisi...
Chaîne de caractères
• Fini les bidouilles de tableau de caractères
• On utilise une classe à part entière
String s=new St...
Concaténation
String nom=”Paul”;
String phrase=”Bonjour,”+nom+”, comment va ?”;

• On peut également concaténer des élémen...
Concaténation par
buffer

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

String s=”Bonjo...
Comparaison de
chaînes de caractères
• La comparaison directe va comparer les
pointeurs, pas le contenu :
if(s1==s2) ...

...
Intérêt d’une classe
• Rappel : une classe =
• des informations (attributs)
• des actions pour manipuler ces
informations ...
Encapsulation dans une
chaîne de caractères
Avant :
La chaîne :
char[50]
Les outils :
(répartis dans
diverses librairies)
...
Méthode vs Fonction
• Taille d’une chaîne en PHP via la fonction
strlen :

$taille=strlen($chaine);

• Equivalent en Java ...
Méthodes utiles de
String
trim()
Supprime les espaces
toLowerCase()
Force en minuscules
toUpperCase()
Force en majuscule
s...
Utilisation de la Javadoc

mercredi 23 octobre 13
Utilisation de la Javadoc
临河而羡鱼,不如归家织网

mercredi 23 octobre 13
Utilisation de la Javadoc
临河而羡鱼,不如归家织网
Si tu donnes un poisson à un homme, il mangera un jour.
Si tu lui apprend à pêcher,...
Liste des
packages

Index des
méthodes
Package
Héritage

Liste des
classes

mercredi 23 octobre 13
Clic pour voir le
détail

Regarder le
type de sortie pour
choisir une bonne
méthode

Méthode
statique
mercredi 23 octobre ...
Transtypage / Casting
• Le transtypage permet de gérer les
conversions d’un type à un autre

• Différents cas se présenten...
Casting entre types
scalaires
• Tout est possible, mais attention aux pertes
de précision

int i=10;
double d=10.1;
d=i; /...
Perte de précisions
dans les calculs
• Exemple :
int i=4;
int j=3;
double result=i/j;

i/j est une expression
donnant un e...
Cast entre classes :
downcasting
Livre livre=new Livre(...);
Produit prod;
prod=(Produit) livre; // autorisé
prod=livre; /...
Cast entre classes :
upcasting
Produit prod=new Livre(...); // autorisé (downcast)
Livre livre;
livre=prod; // interdit
li...
Cast entre classes et
types scalaires
• Ex : passer un String en int, ou inversement
• Ce n’est pas possible directement
•...
Les class Wrappers
• Ce sont des classes encapsulant des types
scalaires

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

• Permet ...
Class Wrappers
disponibles
Type primitif
boolean
byte
double
short
int
long
float
char

mercredi 23 octobre 13

Wrapper
Boo...
Conversion d’un String
en int

Javadoc du class Wrap Integer :

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

int val=iWra...
Conversion String/int avec
une méthode statique
Javadoc du class Wrap Integer :

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

• On utilise encore le classwrap Integer :
int val=12;
Integer iWrap=new Integer(val);
String s=...
Autoboxing de Java5

• Dans certains cas, l’encapsulation de types
dans des classwrap est automatique en
Java>5

• Exemple...
Listes dynamiques
• Classes héritant de la structure List :
• ArrayList : redimensionnement auto d’un
tableau

• LinkedLis...
Exploitation d’une liste
• Création :
ArrayList liste=new ArrayList();

• Remplissage :
liste.add(element);

• Récupératio...
Typage de listes en
Java >5
• Avant : upcasting risqué
Voiture v=(Voiture)liste.get(i);

• Après : listes typées et typage...
Parcours de liste par
boucle for
ArrayList<Voiture> liste=new ArrayList<Voiture>();
...
for(int i=0;i<liste.size();i++)
{
...
Parcours de liste par
itérateur
ArrayList<Voiture> liste=new ArrayList<Voiture>();
...
Iterator<Voiture> it=liste.iterator...
Parcours de liste par
itérateur implicite (Java5)
ArrayList<Voiture> liste=new ArrayList<Voiture>();
...
for(Voiture v: li...
Expression d’une
instance en String

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

Voiture v=new Voiture(...
Surcharge de toString()

• Surcharger cette méthode permet de

personnaliser l’affichage de l’instance
public class Voiture...
Intérêts de la méthode
toString()
• Le concept d’instance “autodescriptive” est
très intéressant pour le debug

• Il est p...
Exceptions
• Une exception représente soit :
• Une erreur (système)
• Une erreur (de votre application)
• Un cas alternati...
Section de code
critique
• Le code potentiellement source d’erreur
sera encadré par un bloc try :

try
{
FileReader f=new ...
Capture des erreurs
• Chaque bloc try est suivi d’un ou plusieurs
blocs catch

• Si une erreur apparaît, l’exécution de tr...
Enchaînement try/catch
try
{
...
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
catch(Exception e)
{ ......
.......
try
{
...
instruction à problème
.....
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
......
mer...
.......
try
{
...
instruction à problème
.....
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
......
mer...
.......
try
{
...
instruction à problème
.....
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
......
mer...
.......
try
{
...
instruction à problème
.....
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
......
mer...
.......
try
{
...
instruction à problème
.....
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
......
mer...
.......
try
{
...
instruction à problème
.....
}
catch(IOException ioe)
{
.... gestion de l’erreur de type IO
}
......
mer...
Que faire en cas
d’erreur ?
• L’erreur peut se réparer localement ?
• On fait un try/catch
• L’erreur est grave, il faut s...
Avant la remontée
d’erreur
void uneMethode()
{
....
instructionAProbleme
...
}

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

mercredi ...
Remontée d’erreur
void uneMethode()
throws IOException
{
....
instructionAProbleme
...
}

{
....
Cet appel
est devenu sect...
Différentes exceptions
• Celles héritant de Exception
• “checked exceptions”, les plus connues
• Celles héritant de Error
...
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
c...
Générer ses propres
exceptions
1) Définir l’exception

• Il s’agit d’une classe héritant de Exception

public class QINegat...
Générer ses propres
exceptions
2) Lancer l’exception

• Lorsque celà vous parait utile, vous lancez l’exception
{
...
if(q...
Générer ses propres
exceptions
3) Définir le code critique

• La méthode où vous avez lancé l’exception devient
section de ...
Générer ses propres
exceptions
4) Lever l’exception

• On gère l’appel au code critique comme à l’accoutumée
try
L’utilisa...
Comment gérer
l’erreur ?

• Le plus souvent, on se contente d’afficher l’erreur
• System.err.println(e.getMessage());
• e.p...
Lire un fichier de
propriétés
• La plupart des applis Java stockent leurs

paramètres dans un fichier texte de type :
machin...
Utilisation de la classe
Properties

Fichier
monappli.properties

import java.util.Properties;

monappli.url=http://www.ol...
Marshalling XML
• Objectif : sauvegarder une trace de ses
données sous forme d’un fichier XML

• Exemple : fichier de configu...
Avec Java standard
• Depuis la v1.4, on dispose de classes
XMLEncoder et XMLDecoder

• Usage :
XMLEncoder e = new XMLEncod...
Limitation de ces
classes

• Utilisation impérative de beans

(constructeur sans paramètre et get/set
systématiques)

• Co...
Avec XStream

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

// écriture du XML à partir d’une instance de classe
xstrea...
Sérialisation
• Va prendre une “image “ d’une instance
telle qu’elle est présente en mémoire

• Et la transforme en suite ...
Mise en place
• Les classes à stocker doivent implémenter
l’interface Serializable

• Cette interface est vide, aucune mét...
ObjectOutputStream
• Exemple de stockage dans un fichier :
! FileOutputStream fos = new FileOutputStream("t.tmp");
! Object...
ObjectInputStream
• Relecture de l’objet à partir du fichier
! FileInputStream fis = new FileInputStream("t.tmp");
! ObjectI...
Qu’est ce qui est
sérialisé ?

• Données ET méthodes
• Vraie encapsulation
• Sérialisation en cascade
• Si des attributs p...
Gestion des logs
• Objectif : remplacer les bêtes “println” qui
parsement nos programmes

• Pourquoi ?
• Pouvoir les redir...
L’outil Log4J d’Apache
• Autre possibilité : java.util.logging
• Permet la gestion de différents niveaux d’erreur
• DEBUG ...
Utilisation de Log4J
	
	
	
	
	
	
	
	
	
	
	
	
	

mercredi 23 octobre 13

// récup du fichier de configuration	
PropertyConf...
Fichier de configuration
# Set root category priority to INFO and its only appender to
CONSOLE.
log4j.rootCategory=INFO, CO...
Prochain SlideShare
Chargement dans…5
×

Java - notions de bases pour développeur

1 541 vues

Publié le

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
1 541
Sur SlideShare
0
Issues des intégrations
0
Intégrations
3
Actions
Partages
0
Téléchargements
134
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Java - notions de bases pour développeur

  1. 1. Java La syntaxe Les aspects techniques jd@olek.fr - Version du 22/10/13 mercredi 23 octobre 13
  2. 2. 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
  3. 3. Différentes versions • • • 1996 : JDK 1.0 (211 classes) 1997 : JDK 1.1 (477 classes) 1998 : Java 2 (1 524 classes) • • • • • • • • mercredi 23 octobre 13 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)
  4. 4. Cycle de compilation d’un langage ‘classique’ Compilateur Code source toto.c Editeur de liens Code objet toto.o •Fichier texte •Fichier binaire •Compatibilité si langage •Compatibilité CPU normé Code exécutable toto.exe •Fichier binaire •Compatibilité OS Liaison avec des bibliothèques faisant la liaison avec le système mercredi 23 octobre 13
  5. 5. Compilation/exécution en Java Compilateur Code source Toto.java •Fichier texte •Compatibilité totale (norme gérée par Sun) Exécution par la JVM Bytecode Toto.class •Fichier binaire •Compatibilité JVM Code interprété ou émulé •Exécution directe en mémoire •Compatibilité OS Liaison avec des bibliothèques elles aussi en bytecode mercredi 23 octobre 13
  6. 6. 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
  7. 7. 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
  8. 8. 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
  9. 9. 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
  10. 10. 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
  11. 11. 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
  12. 12. 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
  13. 13. 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
  14. 14. 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
  15. 15. 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
  16. 16. 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
  17. 17. 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
  18. 18. 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
  19. 19. 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
  20. 20. 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
  21. 21. 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
  22. 22. 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
  23. 23. 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
  24. 24. 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
  25. 25. 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
  26. 26. Les différents types numériques disponibles Type Taille mémoire byte 1 octet short 2 octets int 4 octets long 8 octets • Par défaut, les nombres sont de type int • Les suffixes permettent de forcer un type : 1234L mercredi 23 octobre 13
  27. 27. Types réels Type Taille mémoire float 4 octets double 8 octets • 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 mercredi 23 octobre 13
  28. 28. 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
  29. 29. Exemple de test booléen Expression booléenne if(a==b) .... • Pour tester un booléen : boolean flag=false; ... if(flag==true) if(flag) mercredi 23 octobre 13 Expression redondante if(flag==false) if(!flag)
  30. 30. Conditions if(expression) instruction1; else instruction2; instruction3; mercredi 23 octobre 13 •Chaque expression est booléenne •Chaque instruction peut être remplacée par un bloc : { if(expression1) instruction1; else if(expression2) } instruction2; else if(expression3) instruction3; else instruction4; instruction 1; ... instruction n;
  31. 31. Choix multiples int choix; switch(choix) { case 1: Exécuté si choix=1 i=3; break; Ordre de débranchement case 2: case 3: i=4; break; Exécuté si choix=2 ou 3 default: i=3; Choix par défaut } mercredi 23 octobre 13 switch/case ne marche qu’avec des types scalaires ! (=>pas de String)
  32. 32. Boucles • La boucle type en Java est while : while(condition) { instruction1; } Exécuté au moins une fois mercredi 23 octobre 13 do { instruction1; } while(condition)
  33. 33. 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; } Exemple : for(int i=0;i<10;i++) ... mercredi 23 octobre 13
  34. 34. Caractères • • • • mercredi 23 octobre 13 Particularité de Java : tout caractère est au format UNICODE sur 16 bits Saisie d’une constante caractère : char char char char c1=’A’; c2=’t’; c3=’060’; c4=’u0030’; // // // // // Caractère en dur Séquence d’échappement classique du C Exactement 3 chiffres en octal 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 •
  35. 35. 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
  36. 36. Concaténation String 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
  37. 37. 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
  38. 38. 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
  39. 39. 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
  40. 40. Encapsulation dans une chaîne de caractères Avant : La chaîne : char[50] Les outils : (répartis dans diverses librairies) strcmp strstr strpos ... mercredi 23 octobre 13 Après : String chaine substr(int,int) size() equals(String) ...
  41. 41. Méthode vs Fonction • Taille d’une chaîne en PHP via la fonction strlen : $taille=strlen($chaine); • Equivalent en Java : Un outil auquel on fournit la donnée int taille=chaine.length(); Une donnée encapsulant ses outils mercredi 23 octobre 13
  42. 42. 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
  43. 43. Utilisation de la Javadoc mercredi 23 octobre 13
  44. 44. Utilisation de la Javadoc 临河而羡鱼,不如归家织网 mercredi 23 octobre 13
  45. 45. 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
  46. 46. Liste des packages Index des méthodes Package Héritage Liste des classes mercredi 23 octobre 13
  47. 47. Clic pour voir le détail Regarder le type de sortie pour choisir une bonne méthode Méthode statique mercredi 23 octobre 13
  48. 48. 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
  49. 49. Casting entre types scalaires • Tout est possible, mais attention aux pertes de précision int i=10; double d=10.1; d=i; // interdit d=(double)i; // autorisé i=(int)d; // autorisé, mais perte de précision mercredi 23 octobre 13
  50. 50. Perte de précisions dans les calculs • Exemple : int i=4; int j=3; double result=i/j; i/j est une expression donnant un entier • Pour limiter la perte, il faut : double result=i/(double)j; ou double result=(double)i/j; mercredi 23 octobre 13 int / double est un double
  51. 51. 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
  52. 52. Cast entre classes : upcasting Produit prod=new Livre(...); // autorisé (downcast) Livre livre; livre=prod; // interdit livre=(Livre)prod; // autorisé, mais risqué mercredi 23 octobre 13
  53. 53. 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
  54. 54. 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
  55. 55. Class Wrappers disponibles Type primitif boolean byte double short int long float char mercredi 23 octobre 13 Wrapper Boolean Byte Double Short Integer Long Float Character
  56. 56. 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
  57. 57. 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
  58. 58. 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
  59. 59. 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
  60. 60. 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
  61. 61. 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
  62. 62. 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
  63. 63. Parcours de liste par boucle for ArrayList<Voiture> liste=new ArrayList<Voiture>(); ... for(int i=0;i<liste.size();i++) { size() détermine Voiture v=liste.get(i); le nb d’éléments ... } mercredi 23 octobre 13
  64. 64. 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
  65. 65. 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
  66. 66. 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
  67. 67. Surcharge de toString() • Surcharger cette méthode permet de personnaliser l’affichage de l’instance public class Voiture { ... public String toString() { return “Je suis la voiture “ +this.nom; Voiture v=new Voiture(); } System.out.println(v); } Je suis la voiture XXX ➡ mercredi 23 octobre 13
  68. 68. 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
  69. 69. Exceptions • Une exception représente soit : • Une erreur (système) • Une erreur (de votre application) • Un cas alternatif mercredi 23 octobre 13
  70. 70. 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
  71. 71. 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
  72. 72. Enchaînement try/catch try { ... } catch(IOException ioe) { .... gestion de l’erreur de type IO } catch(Exception e) { ... gestion des autres erreurs } mercredi 23 octobre 13
  73. 73. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  74. 74. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  75. 75. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  76. 76. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  77. 77. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  78. 78. ....... try { ... instruction à problème ..... } catch(IOException ioe) { .... gestion de l’erreur de type IO } ...... mercredi 23 octobre 13
  79. 79. 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
  80. 80. Avant la remontée d’erreur void uneMethode() { .... instructionAProbleme ... } { .... inst.uneMethode(); ... } mercredi 23 octobre 13
  81. 81. Remontée d’erreur void uneMethode() throws IOException { .... instructionAProbleme ... } { .... Cet appel est devenu section try de code critique { inst.uneMethode(); } catch(IOException ioe) { ... } ... } mercredi 23 octobre 13
  82. 82. 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
  83. 83. 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 mercredi 23 octobre 13 try { ..... } catch(Exception e) { .... ; return; } finally { .. // est exécuté avant le return }
  84. 84. Générer ses propres exceptions 1) Définir l’exception • Il s’agit d’une classe héritant de Exception public 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
  85. 85. 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
  86. 86. 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 { Ne pas confondre ... avec throw (sans S) if(l.getQi()<0) throw new QINegatifException(l.getNom()); ... } mercredi 23 octobre 13
  87. 87. Générer ses propres exceptions 4) Lever l’exception • On gère l’appel au code critique comme à l’accoutumée try L’utilisateur de la { classe est obligé par le compilateur de gérer l’exception ... ‘proprement’ loft.ajoutLofteur(l); ... } catch(QINegatifException qie) { ... } mercredi 23 octobre 13
  88. 88. 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
  89. 89. 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
  90. 90. Utilisation de la classe Properties Fichier monappli.properties import java.util.Properties; monappli.url=http://www.olek.fr monappli.chemin=/usr/local/appli 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"); mercredi 23 octobre 13
  91. 91. 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
  92. 92. 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
  93. 93. 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
  94. 94. Avec XStream XStream xstream = new XStream(new DomDriver()); // écriture du XML à partir d’une instance de classe xstream.toXML(inst, new BufferedOutputStream( new FileOutputStream("Test.xml"))); // lecture du XML et récupération de l’instance MaClasse 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
  95. 95. 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
  96. 96. 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
  97. 97. 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
  98. 98. 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
  99. 99. 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
  100. 100. 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
  101. 101. 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
  102. 102. Utilisation de Log4J mercredi 23 octobre 13 // 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 !");
  103. 103. 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.ConsoleAppender log4j.appender.CONSOLE.Threshold=INFO log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[%t] %-5p %c - %m%n mercredi 23 octobre 13

×