Présentation du langage Java

Slides:



Advertisements
Présentations similaires
Bratec Martin ..
Advertisements

NOTIFICATION ÉLECTRONIQUE
Fragilité : une notion fragile ?
SEMINAIRE DU 10 AVRIL 2010 programmation du futur Hôtel de Ville
Phono-sémantique différentielle des monosyllabes italiens
MAGGIO 1967 BOLOGNA - CERVIA ANOMALIES DU SOMMEIL CHEZ L'HOMME
droit + pub = ? vincent gautrais professeur agrégé – avocat
Transcription de la présentation:

Présentation du langage Java Chapitre I (Merci à Alain PILLOT pour son cours !)

PLAN du Module Java Chapitre 1 – Les bases de Java Les bases, introduction, la syntaxe java Chapitre 2 - Programmation orientée Objet avec Java Chapitre 3 – Environnement Java Plateforme java, Sécurité dans java Chapitre 4 – Les interfaces en Java Chapitre 5 – les JavaBeans

Références bibliographiques Flanagan et Gachet, Java in a nutshell (Java1.4), 4ème édition (en français), O’REILLY, 2002 Horstmann Cornell, Au cœur de JAVA, Volume 1 et volume 2, CAMPUSPRESS, 1999 Delannoy, Programmer en JAVA, EYROLLES, 2000 Lemay Cadenhead, JAVA 2, CAMPUSPRESS, 2002 Horton, Maîtrisez Java 2, CAMPUSPRESS, 2001 M. Lai, Penser Objet avec UML et Java Masson - InterEdition, 1998

Sites java http://java.sun.com Pour les développeurs : http://developer.java.sun.com (gratuit mais il faut s’enregistrer) Sur la plateforme distribuée en java : http://www.oreillynet.com incluant onjava.com Tous les exemples du livre « Java in a nutshell » sont téléchargeables sur : http://www.oreilly.com/catalog/javanut4

Sites Java (2) à vérifier Normes de programmation en Java : http://www.damas.ift.ulaval.ca/ressources/normes/NormesJAVA.html http://www.gamelan.com http://cuiwww.unige.ch/java/doc/tutorial/java/index.html http://www.ensta.fr/java/java_liens.html

1 - Généralités M. Lai, Penser Objet avec UML et Java, Masson - InterEdition, 1998

Historique Début 90, une équipe dirigée par James Gosling de SunSoft est chargée de développer un nouveau langage « léger » appelé OAK Doit être déployable partout : magnétoscope, GAB Multi plateformes Intégration des avancées en Génie Logiciel (COO) En même temps, Internet explose oak change de nom et devient java, se découvre être l’idéal pour internet : peu de bande passante consommée, sécurisé, multi plateformes, adapté aux contraintes réseaux (virus, piratage..), exploite la puissance de calcul du poste client… Dans une architecture client-serveur classique, tous les calculs complexes sont réalisés par le serveur, le client étant souvent réduit à un "super terminal". En effet, l'évolution des versions des logiciels impose de modifier à chaque fois le client si celui-ci prend en charge trop de fonctionnalités. Dans certains environnements distribués, cela peut parfois poser des problèmes. Dans une architecture client-serveur en Java, le client effectue aussi des calculs complexes. Dans le cas d'applet, le client étant téléchargé à chaque connexion, la mise à jour est automatique.

Caractéristiques générales (1) Java est donc un langage de programmation proposé par Sun Microsystems à partir des années 95 C’est un langage " à objets " classes objets messages héritage Le langage développé intégrait un grand nombre des avancées en génie logiciel. programmation objet uniquement

Caractéristiques générales (2) Java est un langage sécurisé : pas de pointeurs, mais des références pas de dépassement d'indice de tableau pas de conversion implicite de types tous les objets sont créés dynamiquement nettoyage automatique de la mémoire complexité de l'héritage multiple contournée par la notion d'interface

Caractéristiques générales (3) Java implémente des mécanismes avancés : programmation parallèle multithread synchronisation, exclusion mutuelle, communication portabilité le compilateur génère un pseudo-code (le byte-code) exécuté par la machine virtuelle propre à chaque environnement distribution du code chargement dynamique code mobile

Caractéristiques générales (4) Java est un langage simple syntaxe familière similaire à celle du C++ le corpus des règles est limité les constructions sont simples les données sont typées selon des standards (C2, IEEE 754, Unicode) La difficulté de programmation réside essentiellement dans la maîtrise des concepts objets

Différences C et Java (1) Pas de préprocesseur Déf. des constantes par static final Pas de macro (mais de moins en moins utiles) Pas de compilation conditionnelle (inutile au niveau du programmeur, portabilité entre plateformes) Pas de variable globale, sinon au niveau d’une classe : Variables globales instances paquetage classes Rq : il est plus facile de passer du C à Java que du C++ à Java ! Les similarités sont bien pus fortes entre C et Java, bien que l’un soit OO et l’autre non… « Attention, la similarité de syntaxe entre C++ et Java peut donner l’illusion de connaître Java » Appel à une variable de classe (avec public) hors de la classe : nomClasse.nomVariable champs Variables locales méthodes

Différences C et Java (2) Types primitifs : de tailles bien définies En C, fonction de la machine Pas de pointeurs Les classes et tableaux sont en Java de type Référence Référence = pointeur opaque : on ne peut rien faire avec (pas de &, de * ou de ->, pas de sizeof, pas de conversion en type primitif) Ramasse-miettes : fournie avec la MVJ Pas de goto : break et continue sont de bons substituts !

Différences C et Java (3) Localisation des déclarations de variables : libre Compilateur Java plus souple : les méthodes peuvent être invoquées alors qu’elles ne sont définies qu’après Surcharge possible des méthodes : avec une liste des paramètres différente Pas de type struct ni union,pas d’enum, pas de champs de bits Pas de typedef Pas de méthode à nb variable d’arguments La surcharge permet d’en simuler le fonctionnement On peut aussi transmettre les arguments sous forme d’un tableau Object

JAVA VERSUS C/C++ Pas de pointeurs Pas de conversions automatiques de types Pas d’héritage multiples pour les classes ( interfaces) Pas de surcharge des opérateurs Pas de variables globales Pas de pré-processeur Pas de structures ni d’unions, ni de types énumérés Vérification des débordements des indices de tableaux Gestion automatique de la mémoire La taille des types est indépendante du SE de l’ordinateur …

L’AVENIR DE JAVA Les Java beans 100 % Pure Java Les puces Java Tentatives d’uniformisation de composants réutilisables et configurables à l’aide d’outils. 100 % Pure Java Mise en place par Sun d’une politique de certification d’application 100% pure Java. Les puces Java Microprocesseur « spécialisé » destiné à combler le manque de performance de Java.

2 – Développer avec Java

Principe de fonctionnement Pour qu'un même programme puisse s'exécuter sur des machines de natures différentes (Unix, Windows, Mac, ...), le programme est en fait exécuté par une machine virtuelle. Ainsi, de son point de vue, le programme s'exécute toujours sur la même machine. Une machine virtuelle Java sur un poste  capable d'exécuter tous les programmes Java « Write once, run anywhere » slogan WORA Les concepteurs de Java ont énoncé le principe suivant pour leur langage : compilez une fois, exécutez partout. Pour limiter l'utilisation de la bande passante, on place avec la machine virtuelle, chez le client, un ensemble d'éléments standard. Ainsi, le programme à exécuter ne contient que ses éléments spécifiques.

Les types d'application (1) Programme Java pseudo-code obtenu par la compilation d'un source écrit en langage Java exécuté de manière autonome à l'aide de l'interpréteur Java Virtual Machine (JVM). correspond à une application au sens classique Applet p-code invoqué depuis des documents HTML exécuté à l'intérieur du navigateur ou encore grâce à un programme dédié : l'applet viewer résidant sur le serveur et téléchargé via le réseau les applets n'ont pas de bloc main() : la méthode main() est appelée par la machine virtuelle pour exécuter une application. les applets ne peuvent pas être testées avec l'interpréteur mais doivent être intégrées à une page HTML, elle même visualisée avec un navigateur sachant gérer les applets Java, ou testées avec l'applet viewer.

Les types d'application (2) Mais aussi… Servlet Java = applet côté serveur et sans interface utilisateur (pgm exécuté par un serveur web) Java Beans = composants logiciels écrits en Java et réutilisables JavaScript = langage frère de Java simplifié pour être directement intégré dans une page HTML afin d'effectuer des traitements sur le poste client

Chaîne de développement (1) Écriture à l'aide d'un éditeur du fichier source d'extension .java (exemple NomFic.java) Compilation du source pour compiler : javac NomFic.java on obtient le fichier de byte-code NomFic.class Exécution du byte-code pour une application : java NomFic.class pour une applet, on invoque le code à l'intérieur d'une page HTML grâce aux balises : <applet code = "NomFic.class" …</applet>

Chaîne de développement (2) Exemple de fichier source // HelloWorld.java public class HelloWorld { public static void main(String[] args){ System.out.println("Hello World!"); } }

Chaîne de développement (3) Remarques : Tout fichier source .java doit avoir une classe déclarée public portant le même nom que le fichier sans l'extension ici class HelloWorld  fichier HelloWord.java Pas de fonctions ou de variables globales : même le point d'entrée du programme main appartient à une classe L'usage veut qu'un fichier source ne contienne qu'une seule classe Attention à la casse ! Distinction Majuscules/Minuscules

Chaîne de développement (4) Compilation et exécution avec le SDK $javac HelloWorld.java $java HelloWorld Hello World! $ S'il n'y a pas d'erreur, le compilateur produit un fichier ".class" par classe définie dans le fichier

Inclusion de classes prédéfinies Si le fichier x.java utilise des classes définies dans d'autres fichiers, le compilateur va les chercher « de lui-même ». C'est le cas dans l’exemple : System est en fait une classe prédéfinie de Java System.out.println("Hello World!”); Il n'y a pas besoin de directive du type "#include" comme en C.

Chaîne de développement (5) HelloWorld.java javac HelloWorld.java HelloWorld.class Fichier source Programme compilé (p-code) Compilation Moteur d’interprétation p-code Registres / piles virtuels Machine virtuelle Java Système d'Exploitation Unix, Windows, Mac, etc. java HelloWorld Pour que la compilation fonctionne, il est nécessaire que la variable d'environnement CLASSPATH possède un chemin d'accès au fichier classes.zip fourni avec le compilateur (cela n'est pas nécessaire à partir de Java 2). Source P.Emy CERTA

Les outils (1) Le minimum requis Pour les applets il faut en plus : un éditeur de texte (exemple TextPad, WordPad) javac (le compilateur) java (l'interpréteur de pseudo-code) Pour les applets il faut en plus : Soit le visualiseur applet viewer ; Soit: une connexion réseau la pile protocolaire TCP/IP un navigateur avec un interpréteur Java

Les outils (2) Les outils de base permettant de compiler et d'exécuter des programmes Java sont regroupés dans le J2SE (anciennement JDK, Java Developpement Kit) de Sun téléchargeable à partir du site http://java.sun.com/ L’IDE (Integrated Development Environment) fournit un cadre de développement et débuggage gratuit (produit Sun). Attention : très volumineux !! Il existe aussi de nombreux outils intégrés : Jbuilder de Borland; Jdeveloper d'Oracle; Visual J++ Café de Symantec , etc. Le bouquet IDE + SDK = 440 Mo !

Les outils (3) L'utilitaire jar (Java Archive) permet : d'archiver des classes Java; mais aussi des fichiers image ou audio ; de distribuer ou d'installer une application. Pour créer un fichier jar : jar –options [path][…] (options identiques à celles de l'utilitaire tar d'Unix) Pour récupérer le contenu d'un fichier jar par la ligne de commande jar –t [path][…] dans une applet par <APPLET CODE="….class" ARCHIVE="….jar" …>

Un premier programme Java Modificateur : la classe est accessible partout où le package associé l’est Nom de la classe Type retourné par la méthode // fichier ex1.java // exemple avec un main comprenant deux boucles public class Ex1{ public static void main(String[] args) { int i; long s=0; for(i=0;i<10000;i++) s+=i*i*i; System.out.println(s); i=0; do{ System.out.println("i vaut "+i); i=i+1; } while(i<10); } Nom et type de l’argument Affichage à l’écran de s

3 - Éléments du langage

Mots réservés en Java

Identificateur = nom des différents éléments du programme Les identificateurs Identificateur = nom des différents éléments du programme Variable ex: totalGeneral constante ex: TAILLE méthode ex: int getX() classe ex: class MaClasse package ex: java.util.Vector Formé à partir de lettres, de chiffres et des caractères _ et symbole monétaire (pas de chiffre comme premier caractère, pas de caractères de ponctuation )

Conventions pour le choix des identificateurs Packages : en lettres minuscules com.sun.eng, system.out Classe ou interface : un nom ; il commence par une majuscule. S'il y a plus d’un mot, tous les mots commencent par des majuscules : class ImageAnimee; Attributs : commencent par (un symbole de soulignement puis) une minuscule int _rayonCercle; Vérifier pour les noms d’attributs ?

deplacerForme(); envoyerMessageATous(); setLargeur(); getLargeur(); Règles (suite) Variables : commencent par une lettre minuscule int largeurCercle; Constantes : tout en majuscules et underscore LARGEUR_MAXIMALE = 50 ; Méthodes : verbe à l'infinitif (suivi éventuellement d'un complément) ; commence par une minuscule, puis Maj à chaque nouveau mot void decalerAGauche(); Le complément peut avoir plus d'un mot. Les méthodes d’accès aux attributs doivent commencer par get ou set et être suivi par le nom de l'attribut : deplacerForme(); envoyerMessageATous(); setLargeur(); getLargeur();

Caractères ou groupe de caractères pour représenter des opérateurs Les symboles Caractères ou groupe de caractères pour représenter des opérateurs pour représenter des caractères spéciaux & ~ { } ( ) [ ] | \ / * - + % , ; . < > = ! ^ ? : Exemples: == opérateur d'égalité >>> opérateur de décalage binaire à droite non signé

3 styles de commentaires Les commentaires 3 styles de commentaires plusieurs lignes /* ceci est un commentaire qui se termine ici */ sur une ligne // commentaire sur une ligne destiné au générateur automatique de documentation JavaDoc /** commentaire destiné à l'outil de documentation automatique */ Ils ne peuvent être emboîtés

Les commentaires JavaDoc Ils permettent de documenter la classe en même temps que le codage Le programme javadoc génère des fichiers HTML de documentation à partir des fichiers Java On peut inclure du code HTML dans les commentaires Javadoc

Les commentaires JavaDoc Permet de décrire si nécessaire pour une classe ses spécifications sa version son auteur Dans la classe on peut également préciser le rôle de chaque attribut décrire les méthodes (paramètres, valeur retournée, exceptions pouvant être éventuellement générer) meilleure lisibilité du programme

Définition du fichier source Il y a un fichier source pour chaque classe ou interface. Le fichier source Java doit comprendre 3 parties dans cet ordre : Commentaire global /* * Classe: Cercle * * Auteur: Suzie LaBouclette * * 13 mai 2002 Création * 25 mai 2002 Ajout de la méthode XXX * 12 juin 2002 Modification de la méthode YYY */ Instructions package et import package java.awt; import java.awt.peer.CanvasPeer; La déclaration de la classe ou de l'interface

Codage caractères pour Java ASCII  7 bits (permet de représenter solo l’anglais) ISO Latin-1  8 bits (langues Europe Ouest) Unicode  16 bits (toutes les langues) Mais peu de traitement de texte prennent en compte Unicode dans la pratique… La plupart des pgms Java sont rédigés en ASCII pur On peut se contenter d’écrire les pgms en ASCII (format texte), ils fonctionneront sous une forme Unicode valable

Les types en Java se classent en 2 catégories les types primitifs ou types de base les caractères les entiers les réels les booléens les types références les tableaux tous les objets manipulés Important pour le passage de paramètres aux méthodes qui se fait par valeur

Types primitifs Un type booléen Un type caractère 4 types entier : byte, short, int, long Utilisent un nombre de bits différents  plages de valeurs différentes 2 types à virgule flottante (réels) float et double

Les types primitifs Entier: type codé en C2 byte 1 octet (8 bits), entier signé, short 2 octets (16 bits), entier signé, int 4 octets (32 bits), entier signé, long 8 octets (64 bits), entier signé Réel: type codé en IEEE 754 (virgule flottante) float 4 octets (32 bits) double 8 octets (64 bits) Selon le format, préfixe f,F ou d,D Caractère : type char codé en Unicode sur 2 octets, \u et 4 chiffres hexadécimaux Ex.: \u2203 correspond au caractère ‘il existe’ Booléens: type boolean (true/false) codé sur 1 bit Ce sont les seuls types de base. Un programme Java utilise l'ensemble des caractères défini par la norme Unicode. Deux formats sont utilisés pour la représentation des nombres flottants, sur 32 bits et sur 64 bits. Ces représentations utilisent la norme IEEE754.

Les types primitifs Les valeurs particulières de la norme IEEE754 sont fournies par les classes java.lang.Float et java.lang.Double. Pour chacune de ces deux classes, nous avons : POSITIVE_INFINITY (infini), NEGATIVE_INFINITY (-infini) et NaN (Not A Number). La taille de la représentation d'un caractère (char) est de 16 bits, de manière à pouvoir coder tous le caractères unicode possibles. La représentation littérale d'un caractère débute par le caractère apostrophe ' suivi soit du caractère ASCII, soit du codage unicode, soit de la valeur octale pour les caractères compris entre 000 (base 8) et 377 (base 8).

Les types primitifs Codage des caractères ASCII sur 128 premiers caractères les 128 autres = caractères des divers langages les suivants = divers symboles  Les caractères sont écrits entre ’ ainsi la séquence ’\uNNNN’ désigne le caractère dont la valeur Unicode est NNNN ’\u0020’signifie blanc ( identique à ' ') ’\u0041’signifie A ( identique à 'A') ’\’’ signifie ’ ’\\’ signifie \

Constantes entières Appelées ‘littéraux entiers’ en java Exprimés en notation décimale, octale ou hexadécimale (pas binaire) Notation hexadécimale : 0x et série de chiffres ou de lettres de A à F, a à f (base 16) 0xff vaut 255 0xCAFEBABE : nb magique désignant les fichiers de classe Java Notation octale : en base 8, commencent par 0 et série de chiffres (tous, sauf 8 et 9) 0377  255 en octale Il s’agit de zéros !!

Littéraux entiers Par défaut, sont des valeurs du type int int n = 1224; long lp = 3009; Sauf si l ou L précisé : type long long m = 1224L; m = 0xffl;

Littéraux à virgule flottante Par défaut, considérés comme double double d = 3.78e-04; Pour un littéral de type float, préciser f ou F : float f = 3.14F; Ne peuvent pas être exprimés en hexadécimal ou octal Utiliser Float.isNan() et Doble.isNan() pour contrôler si c’est NàN ou pas, car NàN n’est égal à aucun nbre, même pas lui-même !!

Valeurs limites Codage = approximation numérique, d’où pour les classes les classes java.lang.Float et java.lang.Double, existence de : POSITIVE_INFINITY (infini, par ex. 1/0), NEGATIVE_INFINITY (-infini) en cas de dépassement de capacité supérieure Le zéro positif (1/) et le zéro négatif (-1/) en cas de dépassement de capacité inférieure selon la direction NaN (Not A Number) ex. 0/0 Double.NaN constante de classe

Dépassement de valeurs Exemple : byte b1=127,b2=1; byte sum=b1+b2; Ne génère pas d’exception ! int a=23; int b=0; float x= (float) a/b; X vaut l’infini positif !! Sauf pour : division entière par zéro modulo par zéro  ArithmeticException Byte limité à 127

Un premier exemple public class ex1 { public static void main (String[] args) { int i; long s=0; for(i=0;i<10000;i++) s=s+i*i*i; System.out.println(s); i=0; do { System.out.println("i vaut"+i); i=i+1; } while(i<10); } } Affichera plus de 400 milliards puis ‘i vaut’ de 0 à 9

Explications Le fichier s'appelle ex1.java Ce fichier contient une classe publique ex1 ex1 contient une méthode publique et statique ‘main’ : public static void main(String[] args) Le programme exécute cette fonction main()

Main() String[] : type tableau de chaînes de caractères Dans une application Java, il doit y avoir au moins une classe qui possède une méthode main() C’est par elle que débutera l’interpréteur Java public static void main() : obligatoire Une applet : le pgm Java n’est pas exécuté directement par l’interpréteur, mais par une application Java (navigateur web) pas de main() nécessaire Servlet : pgm exécuté par un serveur web

Compilation javac ex1.java compile le programme : on obtient alors le fichier ex1.class On peut exécuter le fichier ex1.class grâce à la machine virtuelle java nommée java Exécution du programme : java ex1

Machine virtuelle java Rend le code java portable sur toutes les machines Elle traduit à la volée le code java Elle implémente les fonctions d'entrée sorties des packages

Les chaînes de caractères En Java il n'y a pas de type chaîne prédéfini Mais le langage manipule ce concept On utilise pour cela la classe String fournie d'origine avec le langage String ch1="voici une chaine"; Ch1 désigne une chaîne constante, non modifiable. Ch1 peut désigner une autre chaîne, ch1 est une variable String ch2="bonjour"; ch1 = ch2; Il existe aussi une classe StringBuffer de chaînes modifiables Ces deux classes font partie du package java.lang reconnu de façon implicite

Conversion de types Boolean est le seul type primitif qui ne peut être converti en autre type primitif Java Cependant attention ! char n’est pas signé Transtypage (ou cast): le plus souvent pour transformer un réel en entier et réciproquement Autres arrondis : Math.round() : public static int round(float a); Math.floor() : public static double floor(double a); Math.ceil() : public static double ceil(double a); On a : Math.ceil(x) = -Math.floor(-x) Floor : plancher; Ceiling : plafond Math.floor(3.14159)  3.00 = plus grande valeur réelle valant un entier qui n’est pas supérieure a l’argument Math.ceil(3.14159)  4.00 = = plus petite valeur réelle valant un entier qui n’est pas inférieure a l’argument

Conversion de chaînes en entier Valeurs limites des types : constante de classes Type.MIN_VALUE Type.MAX_VALUE Ex. : long n; if (n>Integer.MAX_VALUE) …. Méthodes statiques associées aux classes du type: Byte.parseByte() Integer.parseInt()

Déclaration identique au C++ Les variables Déclaration identique au C++ unType var1[,var2,…]; unType var1=val1[,var2=val2,var3,…]; Une variable représente : l’attribut d'une classe une variable de classe une variable locale à une méthode de classe Caractéristiques : conversion toujours explicite et identique au C var1 = (type_force) var2; portée limitée au bloc { } de déclaration

Les variables Exemples : boolean encore = true; // initialisation à vrai int x = 10; // decimal int x = 0x0A; // hexadécimal int x = 10L; // entier long float y = 6.55957F; // réel simple précision x = (int) y; // transtypage d'un réel vers un int float z = -2.45E-3F; // réel avec exposant double PI = 3.14159D; // réel double précision char rep = 'n'; char rep = '\u006e'; // code ASCII de 'n' OK vu VDe

Déclaration de constantes Une constante est définie à l'aide de final et est toujours initialisée final type MA_CONSTANTE = valeur; Exemples: final float CM_PAR_POUCE = 2.54F; final double E = 2.71828182845905D; Une constante de classe est définie à l'aide de static final Exemple: static final float PI = 3.14159F;

Les constantes caractères Caractères spéciaux: '\b' caractère backspace (retour arrière) '\f' caractère saut de page (formfeed) '\n' caractère saut de ligne (new line) '\r' caractère retour chariot (début de ligne) '\t' caractère de tabulation '\\' caractère \ '\'' caractère '

Les opérateurs Opérateur d'affectation = Opérateurs arithmétiques + - * / % ++ -- += -= *= /= %= Opérateurs relationnels > >= == != < <= Opérateurs logiques && || ! Opérateurs binaires & | ^ ~ >> << >>>

Opérateur logique ternaire : ? Les opérateurs (2) Opérateur logique ternaire : ? composé de trois expressions expression1 ? expression2 : expression3 si expression1 vraie alors expression2 sinon expression3 valAbs = (x >= 0) ? x : -x; Opérateur d'allocation mémoire new

Priorité des opérateurs

Opérations sur les caractères La classe Character possède les méthodes statiques utiles : isDigit() isJavaLetter() isLowerCase() toUpperCase()

Exemple 2 public class ex2 { public static void main(String[] args) { byte a; short b; int c; long d; a = -87; b = 16300; c = 2000000000; d = 2000000000000L; System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d); } }

Exemple 3 public class ex3 { public static void main(String[] args) { float a; double b; a = 1.5E30F; b = 1.3E-100; System.out.println(a); System.out.println(b); } } Affiche : 1.5E30 1.3E-100

Exemple 4 Affiche : TRUE FALSE int c; boolean a,b; public class ex4 { public static void main(String[] args) { int c; boolean a,b; a = true; c = 80; b = (c>456); System.out.println(a); System.out.println(b); } } Affiche : TRUE FALSE

Exemple 5 public class ex5 { public static void main(String[] args) { char c; c='5'; if ((c>'0') && (c<='9')) System.out.println("c’est un chiffre !!!!"); } }

Exemple 6 public class ex6 { public static void main(String[] args) { int a,b,c,d,e,f,g,h,i,j,k; a=100; b=30; c=a+b; d=a-b; e=a*b; f=a/b; g=a%b; h=40; i=9; j=80; h*=a; i+=a; j-=b k=3001; k/=30; System.out.println(c); System.out.println(d); System.out.println(e); System.out.println(f); System.out.println(g); System.out.println(h); System.out.println(i); System.out.println(j); System.out.println(k); } Pour f : affichera 3, le dividende de 100/30 Pour g : donnera 10, reste de 100/30, etc…

4 – Les structures de contrôle

Les structures de contrôle L'alternative if (<expression_logique>) <bloc1> else <bloc2> (un bloc commence par { et finit par }) Alternatives imbriquées if (<expr1>) <bloc1> else if (<expr2>) <bloc2> else if (expr3>) <bloc3> else <bloc4>

Les structures de contrôle Le choix multiple switch (<expression_entière>) { case valeur_1: ......; break; case valeur_2: ......; ......; case valeur-n: ......; ......; break; default: ......; ......; }

Les structures de contrôle Le choix multiple (suite) branchement lorsque l'expression entière est égale à une des valeurs des case branchement à default si aucune valeur trouvée passe en séquence jusqu'au premier break ou fin du switch

Les structures de contrôle L'itération bornée traduction du pour for(<expr1>;<expr2>;<expr3>) <bloc> expr1 effectuée 1 fois pour toutes expr2 condition de maintien expr3 effectuée à la fin de chaque boucle nombre de passages 0 à n

Les structures de contrôle La répétitive tant que while(<expression >) <bloc> expression condition de maintien nombre de passages 0 à n La répétitive répéter …tant que do <bloc> while (<expression>) ; nombre de passages 1 à n

Les structures de contrôle L'instruction break permet de sortir d'un switch d'un for d'un while d'un do for(;;) { if (EVENEMENT) break; /* si EVENEMENT devient VRAI on sort */ }

Les structures de contrôle L'instruction continue force le passage à l’itération suivante dans une boucle répétitive la condition de passage est testée à nouveau évite l'écriture d'un sinon while (i<10) { .......; .......; if (n<0) continue; /* on va en fin de bloc */ .......; /* traitement si n >= 0 */ }

5 – Compléments Packages, tableaux, chaînes, exceptions

Les packages Un package regroupe des classes et des interfaces qui ont un lien logique Les classes d’un même paquetage sont dispersées dans plusieurs fichiers sources dont la 1ère ligne est : package nom-de-paquetage; Pour utiliser une classe d'un package existant soit il faut la préfixer avec le nom du package soit on utilise la directive import : import java.util.* importe toutes les classes du package import java.util.Vector importe la classe Vector du package java.util Exemple de packages inclus dans l’API du SDK : java.lang java.io java.util java.net

Package standard L’API Java : ensemble de classes prédéfinies d’usage général que l’on retrouve sur toutes les plates-formes java.lang : classes de base du langage Chaînes, math, processus, exceptions… java.util : structures de données Vecteurs, piles, tables, parcours… java.io : entrées sorties classiques clavier, écran, fichiers,… java.awt : IHM (fénêtrage, événements, graphiques) java.net : communication internet (manipulation d’URL, sockets) java.applet : insertion de programmes dans des doc HTML

Les packages (2) Pour créer son propre package il faut ajouter package <nom_package> dans chaque fichier source.java des classes qui vont composer le package il faut s'assurer qu'il n'existe pas de classes homonymes au sein d’un même package Lorsqu'on ne spécifie pas de package dans un fichier source, les classes créées appartiennent au package par défaut On peut récupérer le Package d’une classe donnée avec la méthode getPackage() de l’objet Class La méthode statique Package.getPakage() retourne l’objet Package correspondant au package nommé, s’il existe et s’il a été chargé dans la classe courante. Rq : l’objet Package n’est défini que si une classe de ce package a été chargée La méthode statique Package.getPakages() retourne tous les objets Package qui ont été chargés. Rq : on ne peut pas obtenir la liste des objets Class d’un objet Package donné dans un tableau

Les chaînes La chaîne de caractères (String) n'est pas un type primitif mais un type dérivé de la classe racine java.lang.Object. C'est toutefois un type dérivé particulier puisque sa représentation littérale doit être prise en compte par le langage. Cette représentation est simplement une suite de littéraux caractères (sans les deux caractères apostrophe du début et de la fin), suite qui débute et finit avec le caractère guillemet ("). Ex.: "Une chaîne sur \ndeux lignes" "Une cha\u00EEne avec un caractère unicode"

Opérations sur les chaînes de caractères Les opérations courantes de la classe String sont : concaténation : + et += longueur : length() String ch1="Hello"; // forme abrégée de String ch1= new String("Hello" ); int n = ch1.length(); que vaut n ici ? égalité equals et equalsIgnoreCase (et non pas == qui teste l’égalité des références) String ch2 = new String ("hello"); if (ch2.equals(ch1) == true) … if (ch1. equalsIgnoreCase(ch2) == true) … comparaison : compareTo (cf strcmp() du C) extraction de sous-chaîne : substring(int, int) int ch2 = ch1.substring(2,5);

Opérations sur les chaînes de caractères (2) transformation en un tableau de caractères : toCharArray changer la casse :toUpperCase et toLowerCase suppression des espaces de début et fin : trim etc.  voir l'aide pour les autres méthodes

Exemples de manipulations de chaînes de caractères String ch1 = "essai d'une chaine"; String ch2 = new String ("Bonjour"); // on récupère les 3 premiers car. de ch2: String ch3 = ch2.substring(0,3); int n = ch3.length(); // longueur de ch1 ch2 = ch2 + " tout le monde"; if (ch3.equals("Bon") == true) … … … if (ch3.compareTo(ch1) >= 0) Attention length() : méthode pour String et champ pour les tableaux

LES TABLEAUX

Les tableaux Déclaration : int[] a ; a est une référence vers un tableau d'entiers qui n’existe pas encore en mémoire Instanciation de a : a= new int[10]; a est désormais un tableau de 10 entiers dont les cases sont a[0], a[1], … a[9]

Exemple 9 public class ex9 { public static void main(String[] args) { int [] a; int i; a= new int [10]; for(i=0;i<10;i++) a[i]=i*i; for(i=0;i<10;i++) System.out.println(a[i]); } }

Exemple 10 public class ex10 { public static void main(String[] args) { int [] a={9,7,6,8,9,0}; int i; for(i=0;i<6;i++)System.out.println(a[i]); } }

Les tableaux en Java Sont des objets créés dynamiquement Déclaration type nomTableau[]; ou type[] nomTableau; Puis allocation mémoire (assignation) nomTableau = new type[tailleTableau]; Déclaration et allocation mémoire type nomTableau[] = new type[tailleTableau]; Déclaration et initialisation type nomTableau[] = {val1, val2, val3,...valn};

Les tableaux Comme en C,l'indice du premier élément est 0 Le champ length d'un tableau donne la dimension du tableau Le nb de cases allouées Pas le nb de case remplies ! Par sécurité, Java déclenche les exceptions ArrayIndexOutOfBoundsException si le rang d'un élément est invalide NegativeArraySizeException si la taille est négative à la création du tableau ArrayStoreException si on tente de stocker un élément de type incompatible

Les tableaux : exemple for(i=0;i<tabEntiers.length;i++) // déclaration String tabJour[] = {"Lundi","Mardi","Mercredi"}; short [ ][ ]mat = {{5, 2, 33,-8}, {1, 2, 3, -7}}; int [ ] tabVide = {}; int tabEntiers[] = new int[5]; // parcours for(i=0;i<tabEntiers.length;i++) tabEntiers[i]=i+1; for(lig=0;lig<2;lig++) for (col=0;col<4;col++) ...

Les tableaux Un tableau est en fait une référence, donc: il faut penser à l'allocation mémoire sauf s'il est initialisé à la déclaration il peut être modifié s'il est passé en argument à une méthode une méthode de classe peut retourner un tableau l'affectation entre tableaux de même type porte sur les références (la copie physique se fait par la méthode arraycopy de la classe System) Ne pas oublier: en Java il y a une gestion automatique de la mémoire

LES EXCEPTIONS

LES EXCEPTIONS Les anomalies sont gérées en Java à l’aide des exceptions. Une exception est un événement inattendu lors de l’exécution d’un programme.  Avantage : séparation nette du traitement d’erreur du code normal.

Les exceptions (2) Principe Si on appelle une méthode susceptible de lancer une exception, on se porte candidat par le bloc try si une erreur survient dans la méthode appelée, cette dernière lance une exception par throw l'appelant intercepte l'exception grâce au bloc gestionnaire d'exception catch il y a un gestionnaire par type d'exception le bloc finally est exécuté dans tout les cas et en dernier s'il existe

LES EXCEPTIONS Mécanisme Une méthode  lance  une exception, un gestionnaire d’exception la capture. méthode1 //gère ex // appelle méthode2 Exception ex méthode2 // appelle méthode3 méthode3 // appelle méthode4 méthode4 méthode4 lance une exception; méthode1 la capture.

Les exceptions (3) Schéma général de traitement des exceptions try { // bloc de code pouvant générer l'exception } catch(TypeException1 e) { // traitement approprié pour ce type d'exception } catch(TypeException2 e) { // traitement approprié pour ce type d'exception } finally { // bloc facultatif mais toujours exécuté si présent }

Interception d'une exception try { Methode(); } catch (T param) { ... void Methode() throws T { ... if (probleme) throw new T(); } type T de l'exception

Exceptions contrôlées, Exceptions non contrôlées, Erreurs Toutes les erreurs et les exceptions sont des instances dérivées de la classe Throwable Throwable Error Exception Erreurs internes à Java (chargement d’une classe impossible, …) Exceptions capturées et gérées (lecture après la fin de fichier, URL mal formatée, …) RuntimeException Erreur de programmation (division par 0, …) Ne pas les utiliser Les exceptions créées appartiennent à cette classe Gestion ou non dans le code

EXEMPLE try { // peut lancer MalformedURLException URL u = new URL(str); // peut lancer IOException URLConnection c = u.openConnection(); } catch (MalformedURLException e) { System.err.println("Impossible d'ouvrir URL: " + e); catch (IOException e) { System.err.println("connexion impossible: " + e);

EXEMPLE void myMethod () { try { getSomething(); } catch (IndexOutOfBoundsException e) { System.out.println("Capture IOException "); } catch (Exception e) { System.out.println("Capture Exception "); } finally { System.out.println("Pas d’autres exceptions "); } System.out.println("Goodbye"); Si getSomething() lance une exception IllegalArgumentException : Capture Exception Pas d’autres exceptions Goodbye

Les exceptions (4) Si une méthode est susceptible de générer des exceptions propagées vers l'appelant on déclare dans son en-tête les exceptions qu'elle peut lancer par throws TypeExc1, TypeExc2 ,.. (mais les exceptions héritant de Error ou de RuntimeException ne se déclarent pas) l'exception est lancée par throw <exception> soit il s'agit d'une instance de la hiérachie Exception soit il s'agit d'une instance d'une classe personnelle d'exception qui doit héritée de Exception

Propagation d’une exception vers la méthode appelante : throws public int myMethod() throws exception1 { // code pouvant lancer exception1 } public URL changeURL(URL ancienneURL) throws MalformedURLException { return new URL("http://www.oracle.com"); } La méthode ne capture pas l’exception localement. Elle est transférée à la méthode qui a appelé changeURL()

Les exceptions (5) Capture des exceptions par l'appelant se fait par le gestionnaire catch pour le type voulu si on souhaite que le gestionnaire traite tout type d'exception, on indique Exception comme type catch (Exception e) si une exception n'est pas traitée à un niveau (gestionnaire absent ou de type inadapté), sa gestion est déléguée au niveau supérieur (throws) si l'exception sort de la méthode main sans être gérée, elle est alors traitée par la machine Java

PROPAGATION erreur … try { openConnection(); } catch (IOException e) { finally { void openConnection() throws IOException { … sendRequest(); } void sendRequest() throws IOException { write(header); write(body); } erreur

Gestion d’une exception (1/3) Création d’une exception public class exception1 extends Exception { … } public class UserFileException extends Exception { public UserFileException (String message) { super(message); } }

Gestion d’une exception (2/3) Capturer une exception et lancer une exception différente catch (exception1 e) { throw new exception2(…); } void ReadUserFile throws UserFileException { try { // code pour ouvrir et lire un fichier } catch(IOException e) { throw new UserFileException(e.toString()); }

Gestion d’une exception (3/3) Pour lancer une exception trouver la classe d’exception (ou en créer une), créer une instance de cette classe ‘lancer’ l’instance à l’aide de throws String readData(dataInput in) throws EOFException { … while(…) { if (ch ==-1) // EOF rencontrée { if (n < len) // len: nombre de caractères attendus; n nombre lus throw new EOFException(); } … return s;

Les exceptions Permet le traitement uniforme et structuré des anomalies survenant lors de l'exécution d'un programme Exemple : lecture/écriture au-delà du dernier élément du tableau L'arrêt du programme est propre On peut même intercepter ces exceptions via un mécanisme identique à celui du C++ Par contre en Java, toutes les exceptions sont des objets de la classe Exception

Entrées / Sorties en mode Texte

Sortie écran en mode texte Le package System comprend 3 canaux d'E/S écran out clavier in erreurs err Pour l'affichage à l'écran on utilise 2 méthodes System.out.print et System.out.println qui fait un saut de ligne après l'affichage Ces 2 méthodes ont pour argument une chaîne de caractères toute variable,  son type, peut être concaténée avec l'opérateur + pour former la chaîne d'affichage

Sortie écran en mode texte : exemple class TestAffichage { public static void main(String[] argv) { // variables locales int x = 3; char c='o'; float z = -2.45E-3F; String ch = "essai"; // affichage System.out.println("x= "+x+" et z= "+z); System.out.println("\nc = "+c+" et ch= "+ ch); } }

Entrée clavier en mode texte La saisie en mode texte est compliquée Utilisation du package : java.io.* Utilisation de la classe BufferedReader pour la lecture du flux d'entrée déclaration d’un buffer d’entrée saisie d’une chaîne par la méthode readLine() conversion de la chaîne saisie dans le type recherché Mise en oeuvre d'une gestion des exceptions

Entrée clavier en mode texte : exemple 1/2 import java.io.*; class TestSaisie { public static void main(String args[]) throws IOException { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader rep = new BufferedReader(isr); System.out.print("Entrez une chaine: "); String saisie = rep.readLine(); System.out.println("Voici la chaine saisie: "+ saisie); System.out.print("Entrez un entier: "); int i = Integer.parseInt(rep.readLine()); System.out.println("l'entier i = "+ i); déclaration d’un buffer d’entrée saisie d’une chaîne conversion dans le type recherché

Entrée clavier en mode texte : exemple 2/2 System.out.print("Entrez un reel : "); float f = Float.parseFloat(rep.readLine()); System.out.println("le reel f = "+ f); // cas d'un caractère System.out.print("Entrez un caractere : "); String valeur = rep.readLine() ; char c = valeur.charAt(0); System.out.println("le caractere vaut = "+ c); } // public static void main } // class TestSaisie Utilisation d’une méthode de classe qui retourne un caractère d’une chaîne : String.charAt(int)

Entrée clavier en mode texte Exemple avec gestion des exceptions import java.io.*; class TestSaisieExcep { public static void main(String args[] { // saisie d'un réel avec gestion des exceptions int x = 0; // entier à saisir System.out.print("Entrez un entier : "); try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader rep = new BufferedReader(isr); x = Integer.parseInt(rep.readLine()); }

Entrée clavier en mode texte Exemple avec gestion des exceptions (suite) // exception éventuellement générée par readLine catch (IOException e) { System.out.println("ERREUR DE SAISIE \n\n"); } // exception éventuellement générée par parseInt catch (NumberFormatException e) { System.out.println("ERREUR DE TYPE \n\n"); } System.out.println("l'entier vaut : "+ x); } // public static void main } // class TestSaisie

Application Définition d'un tableau de taille dynamique avec remplissage aléatoire import java.io.*; import java.util.*; class TestTableau { public static void main(String[] argv)throws IOException { // saisie de la dimension du tableau InputStreamReader isr = new InputStreamReader(System.in); BufferedReader rep = new BufferedReader(isr); System.out.print("Entrez un entier : "); int taille = Integer.parseInt(rep.readLine());

Application Définition d'un tableau de taille dynamique avec remplissage aléatoire // dimensionnement dynamique du tableau d'entiers int tabEntiers [] = new int[taille]; // remplissage aléatoire d'entiers compris entre 0 et 50 Random r = new Random(); for(int i=0;i<tabEntiers.length;i++) tabEntiers[i]=Math.abs(r.nextInt()%51); // affichage du tableau for(int i=0;i<tabEntiers.length;i++) System.out.println("\n "+tabEntiers[i]); } // fin de main } // fin de TestTableau