javaNut.book Page xvii Dimanche, 29. janvier 2006 10:04 22 Préface Préface Cet ouvrage est un manuel de référence destiné aux programmeurs Java™. Sa place de prédilection se situe à côté de votre clavier pendant que vous programmez. La première partie de ce livre se compose d’une introduction rapide et directe au langage de programmation Java ainsi qu’aux API (Application Programming Interfaces, c’est-à-dire interfaces de programmation pour les applications) qui forment le noyau de la plate-forme Java. La seconde partie consiste en un guide de référence qui détaille de manière succincte chaque classe et chaque interface formant ces API de base. Ce livre couvre les versions 1.0, 1.1, 1.2, 1.3, 1.4 et 5.0 de Java. Modifications apportées à la cinquième édition La cinquième édition de ce livre couvre Java 5.0. Ce numéro de version largement supérieur à celui de la version précédente atteste du grand nombre de nouveautés apparues dans le langage. Les trois nouveautés les plus importantes sont les types génériques, les types énumérés et les annotations, qui font l’objet d’un chapitre entièrement nouveau. Les programmeurs Java expérimentés qui souhaitent se familiariser immédiatement avec ces nouveautés peuvent passer directement au chapitre 4. Parmi les autres nouveautés de Java 5.0, citons : • L’instruction for/in, qui permet d’itérer facilement sur les tableaux et les collections (cette instruction est parfois appelée « foreach »). • Les conversions autoboxing et auto-unboxing, qui convertissent automatiquement les valeurs primitives en objets d’encapsulation, et vice-versa (par exemple, des valeurs int en objets Integer). • Les méthodes varargs, qui permettent de définir et d’invoquer des méthodes acceptant un nombre arbitraire d’arguments. javaNut.book Page xviii Dimanche, 29. janvier 2006 10:04 22 xviii Préface • Les valeurs de retour covariantes, qui permettent à une classe de redéfinir une méthode d’une super-classe et de restreindre le type de retour de cette méthode. • La déclaration import static, qui permet d’importer les membres statiques d’un type dans l’espace de noms d’un programme. Bien que toutes ces caractéristiques soient nouvelles avec Java 5.0, aucune d’entre elles n’est suffisamment complexe pour justifier un chapitre indépendant. C’est pourquoi la présentation de ces nouveautés est intégrée au chapitre 2. Outre ces changements apportés au langage, Java 5.0 inclut également des modifications apportées à la plate-forme Java. Parmi les améliorations les plus importantes, citons : • Les classes de collection du paquetage java.util ont été converties en types génériques, prenant ainsi en charge les collections à typage fort. Cet aspect est traité au chapitre 4. • Le paquetage java.util inclut également une nouvelle classe nommée Formatter. Cette classe permet de produire du texte formaté à la façon de C, grâce aux méthodes printf() et format(). Des exemples d’utilisation se trouvent au chapitre 5. L’entrée du guide de référence consacrée à la classe java.util.Formatter présente ces nombreuses options de formatage dans une table détaillée. • Le nouveau paquetage java.util.concurrent inclut de nombreuses classes utilitaires pour la programmation à threads multiples. Le chapitre 5 en propose des exemples d’utilisation. • Le paquetage java.lang possède trois nouveaux sous-paquetages : java.lang.annotation, java.lang.instrument et java.lang.management. Ces paquetages prennent en charge les annotations, ainsi que l’instrumentation, la gestion et le suivi d’un interpréteur Java en cours d’exécution. Bien que la présence de ces sous-paquetage au sein du paquetage java.lang témoigne de leur importance, ils ne sont pas couramment utilisés. Des exemples d’annotations se trouvent au chapitre 4 et un exemple simple d’instrumentation et de gestion se trouve au chapitre 5. • De nouveaux paquetages ont été ajoutés à la hiérarchie de javax.xml. javax.xml.validation prend en charge la validation de documents à l’aide de schémas. javax.xml.xpath prend en charge le langage de requête XPath. javax.xml.namespace offre une prise en charge simplifiée des espaces de noms XML. Des exemples de validation et d’utilisation de XPath se trouvent au chapitre 5. Afin de faire place nette pour toutes ces nouveautés, je me suis permis d’élaguer certaines parties des versions précédentes de ce livre. Ainsi, j’ai supprimé du guide de référence la présentation des paquetages java.beans, java.beans.beancontext, java.security.acl et org.ietf.jgss. Les standards liés aux JavaBeans ne se sont pas véritablement imposés dans le noyau des API Java et semblent n’être pertinents que pour Swing et les API graphiques apparentées. Ils n’ont donc plus leur place dans ce livre. Le paquetage java.security.acl est obsolète depuis Java 1.2 et je me suis permis de le supprimer. Quant au paquetage org.ietf.jgss, il n’intéresse que peu de lecteurs. javaNut.book Page xix Dimanche, 29. janvier 2006 10:04 22 Contenu de ce livre xix Outre la suppression du paquetage java.beans du guide de référence, j’ai également supprimé le chapitre qui leur était consacré dans la première partie du livre. Les règles d’attribution des noms propres aux JavaBeans demeurent cependant utiles et ont été déplacées au chapitre 7. Contenu de ce livre Les huit premiers chapitres de ce livre décrivent le langage Java, la plate-forme Java et les outils de développement Java qui sont fournis avec le JDK (pour Java Development Kit, c’est-à-dire kit de développement Java) de Sun. Les cinq premiers chapitres sont essentiels ; les trois suivants traitent des thèmes qui n’intéresseront pas tous les programmeurs Java. Chapitre 1 : Introduction Ce chapitre donne une vue d’ensemble du langage Java et de la plate-forme Java et présente les principales caractéristiques ainsi que les avantages de Java. Il se termine par un exemple de programme Java et invite le nouveau programmeur Java à l’analyser ligne par ligne. Chapitre 2 : La syntaxe Java Ce chapitre présente le langage de programmation Java en détail, y compris certains changements propres à Java 5.0. Il s’agit d’un chapitre long et circonstancié. Les programmeurs Java expérimentés peuvent l’utiliser comme référence du langage. Les programmeurs maîtrisant bien des langages tels que C et C++ doivent être en mesure de comprendre la syntaxe de Java en lisant ce chapitre. Cependant, ce chapitre ne présuppose pas des années d’expérience en programmation ni même une familiarité avec C ou C++. Même les programmeurs débutants bénéficiant d’une expérience modeste doivent être capables d’apprendre la programmation Java en étudiant ce chapitre avec attention. Chapitre 3 : La programmation orientée objet en Java Ce chapitre décrit comment la syntaxe Java de base traitée au chapitre 2 est utilisée pour écrire des programmes orientés objet en Java. Ce chapitre ne présuppose aucune expérience préalable en programmation orientée objet. Il peut être utilisé comme tutoriel par les nouveaux programmeurs ou comme guide de référence par les programmeurs Java expérimentés. Chapitre 4 : Nouveautés du langage Java 5.0 Ce chapitre documente les trois nouveautés les plus importantes de Java 5.0 : les types génériques, les types énumérés et les annotations. Si vous connaissez les éditions précédentes de ce livre, vous pouvez passer directement à ce chapitre. Chapitre 5 : La plate-forme Java Ce chapitre consiste en une vue d’ensemble des API Java essentielles traitées dans ce livre. Il contient de nombreux petits exemples qui montrent comment exécuter des tâches courantes avec les classes et interfaces formant la plate-forme Java. Les programmeurs qui débutent en Java, et particulièrement ceux qui apprennent mieux par l’exemple, apprécieront particulièrement ce chapitre. javaNut.book Page xx Dimanche, 29. janvier 2006 10:04 22 xx Préface Chapitre 6 : La sécurité en Java Ce chapitre explique l’architecture de la sécurité en Java permettant à du code non fiable de s’exécuter dans un environnement sécurisé depuis lequel il ne peut pas infliger de dommages au système hôte. Il est important pour tous les programmeurs Java de posséder des connaissances de base relatives aux mécanismes de sécurité en Java. Chapitre 7 : Conventions de programmation et de documentation en Java Ce chapitre couvre les conventions de programmation Java importantes et largement adoptées, y compris les conventions d’attribution de noms propres aux JavaBeans. Il explique également comment rendre votre code Java auto-documenté en incluant des commentaires de documentation spécialement formatés. Chapitre 8 : Outils de développement Java Le JDK fourni par Sun comprend un certain nombre d’outils de développement Java utiles, principalement l’interpréteur Java et le compilateur Java. Ce chapitre décrit ces outils. Ces huit premiers chapitres vous enseignent le langage Java et vous donnent le niveau suffisant pour utiliser activement les API de Java. La seconde partie du livre est composée d’un guide de référence succinct mais détaillé des API, formaté pour un confort d’utilisation optimal. Donnez-vous la peine de lire la section Comment utiliser ce guide de référence, qui apparaît au début de la section de référence ; elle explique comment en tirer le meilleur parti. Notez également que les chapitres du guide de référence sont suivis d’un dernier chapitre intitulé Index des classes, méthodes et des champs. Cet index particulier vous permet de chercher le nom d’une classe et de trouver le paquetage dans lequel il se trouve, ou de chercher le nom d’une méthode ou d’un champ et de découvrir la classe dans laquelle il ou elle est définie. Ouvrages apparentés O’Reilly consacre une collection entière de livres à la programmation Java, y compris plusieurs ouvrages qui accompagnent celui-ci. Les compagnons du présent ouvrage sont : Java Examples in a Nutshell Ce livre contient des centaines d’exemples complets et fonctionnels illustrant de nombreuses tâches courantes de programmation Java, en utilisant le noyau des API, les classes distribuées et les classes graphiques. Exemples en Java in a Nutshell ressemble au chapitre 4 du présent ouvrage, mais largement étendu en largeur et en profondeur, où tous les extraits de code sont complétés sous la forme d’exemples fonctionnels. Il s’agit d’un livre particulière valable pour les lecteurs qui apprennent facilement en expérimentant du code existant. javaNut.book Page xxi Dimanche, 29. janvier 2006 10:04 22 Exemples en ligne xxi Java Enterprise in a Nutshell Ce livre représente un tutoriel succint et un guide de référence des API distribuées de Java, telles que JDBC, RMI, JNDI et CORBA. Il traite également des outils tels que Hibernate, Struts, ant, JUnit et XDoclet. J2ME in a Nutshell Ce livre représente un tutoriel et un guide de référence des API graphiques, réseau et d’accès aux bases de données de la plate-forme Java 2, Édition Micro (J2ME). Vous pouvez trouver une liste complète des livres traitant de Java publiés par O’Reilly & Associates à l’adresse http://java.oreilly.com/1. Les livres qui se concentrent sur les API Java de base, comme le fait le présent ouvrage, se composent de : Learning Java, de Pat Niemeyer et Jonathan Knudsen Une introduction exhaustive à Java, avec un accent porté sur la programmation Java côté client. Java Swing, de Marc Loy, Robert Eckstein, Dave Wood, James Elliott et Brian Cole Ce livre, qui propose une excellente présentation des API de Swing, est incontournable pour les développeurs d’interfaces utilisateur graphiques. Java Threads, de Scott Oaks et Henry Wong Java facilite la programmation en threads mais son utilisation correcte peut s’avérer délicate. Ce livre explique tout ce que vous devez connaître sur le sujet. Java I/O, de Elliotte Rusty Harold L’architecture des entrées/sorties Java basée sur les flux est un concept d’une rare beauté. Ce livre la traite avec la précision qu’elle mérite. Java Network Programming, de Elliotte Rusty Harold Ce livre traite en profondeur des API Java relatives à l’interconnexion de réseaux. Java Security, de Scott Oaks Ce livre explique en détail les mécanismes de contrôle d’accès de Java et explore également les mécanismes d’authentification des signatures numériques et des message digest. Java Cryptography, de Jonathan Knudsen Ce livre décrit de façon approfondie l’Extension de Cryptographie Java, les paquetages javax.crypto.*, et tout ce que vous devez savoir à propos de la cryptographie en Java. Exemples en ligne Les exemples de ce livre sont disponibles en ligne et peuvent être téléchargés depuis la page web du livre. 1. NdT : ou, pour les traductions françaises, http://www.digitbooks.fr javaNut.book Page xxii Dimanche, 29. janvier 2006 10:04 22 xxii Préface Conventions utilisées dans ce livre Nous utilisons les conventions typographiques suivantes dans ce livre : Le Monde italic Utilisé pour mettre l’accent sur un terme ainsi que pour signifier la première apparition d’un terme. Le style italique est également utilisé pour les commandes, les adresses email, les sites web, les sites FTP, les noms de fichiers et de répertoires et les newsgroups. Le Monde bold Occasionnellement utilisé pour faire référence à des touches particulières du clavier ou à des parties de l’interface utilisateur, telles que le bouton Retour ou le menu Options. TheSansMono Condensed Utilisé pour tout extrait de code Java et généralement pour tout ce que vous saisirez de manière littérale en programmant, y compris les mots clés, les types de données, les constantes, les noms de méthodes, les variables, les noms de classes et les noms d’interfaces. TheSansMono Condensed italic Utilisé avec les noms d’arguments des fonctions et généralement pour indiquer l’endroit où un élément devra être remplacé par une valeur concrète dans votre programme. Le Monde Sans Utilisé dans les résumés des classes Java au sein du guide de référence. Cette police de caractères très étroite nous permet de placer beaucoup d’informations sur la page sans trop de sauts de ligne gênants. Cette police est également utilisée avec des extraits de code dans les descriptions du guide de référence. Le Monde Sans bold Utilisé pour mettre en évidence les noms des classes, des méthodes, des champs, des propriétés et des constructeurs dans le guide de référence, ce qui facilite le survol des résumés des classes. Le Monde Sans italic Utilisé avec les noms des paramètres des méthodes et les commentaires au sein du guide de référence. Contact Aidez-nous à améliorer les éditions futures de ce livre en nous rapportant les erreurs, imprécisions, bogues, instructions équivoques ou embrouillées et même les bonnes vieilles fautes de frappe que vous y trouveriez. Faites-nous également savoir quelles mesures nous devrions prendre pour rendre ce livre plus utile à vos yeux. Nous étudierons sérieusement vos javaNut.book Page xxiii Dimanche, 29. janvier 2006 10:04 22 Comment le guide de référence est-il généré ? xxiii commentaires et essayerons d’introduire les suggestions raisonnables dans nos éditions futures. Vous pouvez nous contacter en écrivant à : Éditions Digit Books 15, rue Fréminville 29200 Brest Comment le guide de référence est-il généré ? À l’attention du lecteur pointilleux ou tout simplement curieux, cette section explique comment ont été créés les guides de référence de Java in a Nutshell et des ouvrages apparentés, dans leur version américaine. Le système de génération du guide de référence à évolué a l’unisson de Java lui-même. Le système actuel fait partie d’un système commercial mis au point pour faciliter la navigation dans une documentation (visitez http://www.davidflanagan.com/Jude/ pour de plus amples informations). Le programme fonctionne en deux étapes : la première étape consiste à rassembler et à organiser les informations relatives aux API, puis la seconde étape à afficher ces informations sous la forme de chapitres dans le guide de référence. Dans la première étape, le système commence par lire les fichiers de classe de toutes les classes et et de toutes les interfaces à documenter. Quasiment toutes les informations relatives aux API du guide de référence sont disponibles dans ces fichiers de classe. La seule exception notable concerne les noms des arguments des méthodes qui ne sont pas enre- javaNut.book Page xxiv Dimanche, 29. janvier 2006 10:04 22 xxiv Préface gistrés dans les fichiers de classe. Ces noms d’arguments sont obtenus en analysant le fichier source Java de chaque classe et de chaque interface. Là où les fichiers source ne sont pas disponibles, j’obtiens les noms des arguments des méthodes en analysant la documentation des API générée par javadoc. Les analyseurs que j’utilise pour extraire les informations relatives aux API à partir des fichiers source et des fichiers javadoc sont créés par le biais du générateur d’analyseurs Antlr développé par Terrence Parr du Magelang Institute. (voir http://www.antlr.org/ pour plus de détails à propos de ce puissant outil de programmation.) Une fois que les informations relatives aux API sont obtenues par lecture des fichiers de classe, des fichiers source et des fichiers javadoc, le programme prend un peu de temps pour trier et établir des références croisées de l’ensemble. Puis il enregistre les informations relatives aux API dans un seul grand fichier de données. Dans la seconde étape, le système lit les informations relatives aux API à partir du fichier de données et produit les chapitres d’un guide de référence en utilisant un format XML personnalisé. Une fois que j’ai généré les données de sortie XML, je les transmets à l’équipe de production de O’Reilly & Associates. Ils les traitent et les convertissent en code source troff. Le code source troff est traité au moyen du programme GNU groff (ftp:// ftp.gnu.org/gnu/groff/) et d’un ensemble personnalisé de macros troff afin de produire le résultat PostScript directement envoyé à l’imprimeur. Remerciements De nombreuses personnes m’ont aidé à créer ce livre et je leur en suis reconnaissant. J’ai une dette envers les très nombreux lecteurs des deux premières éditions qui m’ont communiqué leurs commentaires, suggestions, comptes-rendus de bogues ou leurs éloges. Leurs multiples petites contributions sont éparpillées au sein du livre. Mes excuses vont cependant à tous ceux qui m’ont fait de nombreuses et bonnes suggestions qui n’ont pu être incorporées dans cette édition. Deb Cameron a été l’éditrice de la cinquième édition de ce livre. Deb n’a pas seulement édité le nouveau contenu de cette édition, mais a aussi pris le temps de relire et de suggérer des mises à jour du contenu existant. Deb s’est montée patiente lorsque mon travail sur ce livre a pris une direction inattendue et m’a donné de judicieux conseils pour me remettre sur le droit chemin. La quatrième édition fut éditée par Bob Eckstein, un éditeur consciencieux doté d’un solide sens de l’humour. Paula Ferguson, amie et collègue, a été l’éditrice des trois premières éditions de ce livre. Sa lecture attentive et ses suggestions toujours pratiques ont amélioré le livre. Les nouveautés de cette édition ont été relues par un certain nombres d’ingénieurs de première qualité. Gilad Bracha, de Sun, a relu les portions consacrées aux types génériques. Josh Bloch, un ancien employé de Sun qui travaille désormais chez Google, a relu les portions consacrées aux types énumérés et aux annotations. Josh était déjà relecteur pour les troisième et quatrième éditions de ce livre et ses commentaires avisés m’ont toujours été d’un très grand secours. Je recommande vivement le livre de Josh, Effective Java Programming Guide (Addison Wesley). Neal Gafter qui, tout comme Josh, a quitté Sun javaNut.book Page xxv Dimanche, 29. janvier 2006 10:04 22 Remerciements xxv pour Google, a répondu à de nombreuses questions concernant les annotations et les types génériques. David Biesack de SAS, Changshin Lee de l’entreprise coréenne Tmax Soft et Tim Peierls furent mes collègues au sein du groupe d’experts JSR-201 responsable de plusieurs changements du langage dans Java 5.0. Ils ont relus les portions consacrées aux types génériques et énumérés. Joseph Bowbeer, Brian Goetz et Bill Pugh étaient membres des groupes d’experts JSR-166 et JSR-133 et m’ont aidé à comprendre la programmation à threads multiples du paquetage java.util.concurrency. Iris Garcia de Sun a répondu à mes questions concernant la classe java.util.Formatter, dont elle est l’auteur. J’adresse mes remerciements les plus sincères à tous ces ingénieurs pour leur travail attentif. Toutes les erreurs qui pourraient encore se trouver dans ce livre me sont bien évidemment imputables. La quatrième édition fut également relue par un certains nombres d’ingénieurs de chez Sun ou d’ailleurs. Josh Bloch a relu les portions consacrées aux assertions et à l’API des préférences. Bob Eckstein a relu les parties consacrées à XML. Graham Hamilton a relu l’API de tenue des journaux de bord. Ron Hitchens a relu tout ce qui concerne la nouvelle API d’entrées/sorties. Jonathan Knudsen (également un auteur O’Reilly) a relu les portions consacrées à JSSE et Charlie Lai celles consacrées à JAAS. Ram Marti a relu le texte de JGSS. Philipp Milne, un ancien employé de Sun aujourd’hui chez Dresdner Kleinwort Wasserstein, a relu les parties traitant le mécanisme de persistence des JavaBeans. Mark Reinhold a relu le paquetage java.nio. Mark mérite des remerciements particuliers pour avoir été un relecteur des deuxième, troisième et quatrième éditions de ce livre. Andreas Sterbenz et Brad Wetmore ont relu les parties consacrées à JSSE. La troisième édition a aussi grandement bénéficié des contributions de relecteurs qui connaissent de manière intime la plate-forme Java. Joshua Block, l’un des principaux auteurs de la structure des collections Java, a revu mes descriptions des classes et des interfaces relatives aux collections. L’aide de Joshua a également été précieuse lorsqu’il a discuté avec moi des classes Timer et TimerTask de Java 1.3. Mark Reinhold, créateur du paquetage java.lang.ref, m’a expliqué son œuvre et a relu ma documentation. Scott Oaks a revu mes descriptions des classes et des interfaces Java relatives à la sécurité et à la cryptographie. Joshua, Mark et Scott sont tous ingénieurs chez Sun Microsystems et je leur suis très reconnaissant pour le temps qu’ils ont consacré à ce livre. La documentation du paquetage javax.crypto et de ses sous-paquetages a également été revue par Jon Eaves. Jon a travaillé sur une implémentation de l’Extension Cryptographique de Java (qui est disponible à l’adresse http://www.ava.net.au/) et ses commentaires ont été utiles. Jon travaille à présent chez Fluent Technologies (http://www.fluent.com.au/) en tant que consultant dans les domaines traitant de Java et du commerce électronique. Enfin, le chapitre 1 a été amélioré par les commentaires de relecteurs qui ne connaissaient pas encore la plate-forme Java : Christina Byrne l’a revu avec l’œil de la programmatrice novice et Judita Byrne de Virginia Power a offert ses commentaires de programmatrice COBOL professionnelle. Pour la deuxième édition, John Zukowski a revu le contenu du guide de référence AWT Java 1.1 et George Reese la majeure partie du nouveau contenu restant. La deuxième édition a également bénéficié d’une équipe de relecteurs techniques de rêve issus de Sun. John Rose, auteur de la spécification des classes internes de Java, a revu le chapitre relatif aux classes internes. Mark Reinhold, auteur des nouvelles classes traitant des f lux de carac- javaNut.book Page xxvi Dimanche, 29. janvier 2006 10:04 22 xxvi Préface tères dans java.io, a revu ma documentation relative à ces classes. Nakul Saraiya, concepteur de la nouvelle API de Réflexion Java, a revu ma documentation du paquetage java.lang.reflect. Je suis très reconnaissant envers ces ingénieurs et architectes ; grâce à eux ce livre a gagné en qualité et en précision. Mike Loukides a fourni des conseils de haut niveau pour la première édition de ce livre. Eric Raymond et Troy Downing ont revu cette première édition – ils m’ont aidé à repérer mes erreurs et omissions et m’ont donné de bons conseils pour rendre le livre plus utile aux programmeurs Java. L’équipe de production de O’Reilly & Associates a fourni son excellent travail habituel en faisant naître un livre des fichiers électroniques que je lui ai remis. Mes remerciements vont à tous. Comme toujours, mes remerciements et mon amour vont à Christie. David Flanagan http://www.davidflanagan.com Mars 2005 javaNut.book Page 1 Dimanche, 29. janvier 2006 10:04 22 Chapitre 3 La programmation orientée objet en Java PARTIE I Introduction à Java Cette première partie est une introduction au langage et à la plate-forme Java. Ces chapitres vous fourniront les informations nécessaires pour une bonne prise en main de Java. Chapitre 1, Introduction Chapitre 2, La syntaxe Java Chapitre 3, La programmation orientée objet en Java Chapitre 4, Nouveautés du langage 5.0 Chapitre 5, La plate-forme Java Chapitre 6, La sécurité en Java Chapitre 7, Conventions de programmation et de documentation en Java Chapitre 8, Outils de développement Java javaNut.book Page 2 Dimanche, 29. janvier 2006 10:04 22 javaNut.book Page 3 Dimanche, 29. janvier 2006 10:04 22 Introduction Chapitre 1 : Introduction CHAPITRE 1 Introduction Bienvenue dans l’univers Java. Ce chapitre commence par expliquer ce qu’est Java, puis décrit certaines caractéristiques qui le distinguent d’autres langages de programmation. Ensuite, il fait un bref compte rendu de la structure de ce livre, avec un accent particulier sur les nouveautés de Java 5.0. Enfin, sous forme d’introduction concrète au langage, il vous promène dans un programme Java simple que vous pouvez saisir, compiler et exécuter. Qu’est-ce que Java ? Lorsque l’on parle de Java, il est important de faire la distinction entre le langage de programmation Java, la machine virtuelle Java et la plate-forme Java. Le langage de programmation Java est le langage dans lequel les applications Java (y compris les applets, les servlets et les composants) sont écrites. Lorsqu’un programme Java est compilé, il est converti en byte-code correspondant au langage machine portable d’une architecture processeur à une autre connue sous le nom de machine virtuelle Java, également appelée Java VM ou JVM, c’est-à-dire Java Virtual Machine en anglais. La VM Java peut être mise en œuvre sous forme matérielle mais elle est généralement mise en œuvre sous la forme d’un programme logiciel qui interprète et exécute le byte-code. La plate-forme Java se distingue à la fois du langage Java et de la machine virtuelle Java. La plate-forme Java correspond à un ensemble prédéfini de classes Java qui existent sur chaque installation Java ; ces classes sont disponibles pour tous les programmes Java. La plate-forme Java est parfois mentionnée sous le nom d’environnement d’exécution Java ou de noyau des API Java (API pour Application Programming interfaces, c’est-à-dire interfaces de programmation d’applications). La plate-forme Java peut être étendue au moyen d’extensions standard facultatives. Ces API étendues existent dans certaines installations Java mais il n’est pas garanti qu’elles se trouvent dans toutes les installations. javaNut.book Page 4 Dimanche, 29. janvier 2006 10:04 22 4 Chapitre 1 : Introduction Le langage de programmation Java Le langage de programmation Java est un langage orienté objet de pointe dont la syntaxe est similaire à celle du langage C. Les concepteurs du langage se sont efforcés de rendre le langage Java puissant tout en essayant d’éviter les caractéristiques trop complexes qui ont entravé d’autres langages orientés objet tels que C++. En gardant le langage simple, ses concepteurs ont également facilité la tâche des programmeurs pour écrire du code robuste et sans bogue. Grâce à sa conception élégante et à ses caractéristiques de langage moderne, le langage Java est devenu incroyablement populaire auprès des programmeurs, qui considèrent généralement que travailler avec Java est un plaisir, après avoir peiné avec des langages plus difficiles et moins puissants. Java 5.0, la version la plus récente du langage Java1, inclut un certain nombre de nouveautés, y compris les types génériques, qui augmentent à la fois la complexité et la puissance du langage. Les programmeurs Java plus expérimentés ont accueilli ces nouveautés avec enthousiasme, en dépit de la complexité supplémentaire qu’elles apportent. La machine virtuelle Java La machine virtuelle Java, ou interpréteur Java, représente la pièce maîtresse de toute installation Java. À dessein, les programmes Java sont portables, mais ils ne le sont que pour des plates-formes sur lesquelles un interpréteur Java existe. Sun fournit des implémentations de VM avec son propre système d’exploitation Solaris ainsi que pour les plates-formes Microsoft Windows et Linux. De nombreux autres constructeurs, y compris Apple et divers constructeurs Unix, fournissent des interpréteurs Java pour leurs platesformes respectives. Cependant, la machine virtuelle Java n’existe pas que pour les ordinateurs de bureau. Elle a été portée sur des set-top box2, et des versions sont même disponibles sur des périphériques équipés de Windows CE ou PalmOS. Bien que les interpréteurs ne soient généralement pas considérés comme des systèmes à haute performance, la performance de la VM Java est remarquablement bonne et s’est accrue de manière constante au fil des versions du langage. Les versions les plus récentes s’exécutent spectaculairement vite. On relèvera tout particulièrement une technologie liée à la VM appelée juste-à-temps (JIT, pour just-in-time), par laquelle le byte-code Java est converti à la volée en langage machine natif de la plate-forme sur laquelle tourne le programme, augmentant la vitesse d’exécution des portions de code exécutées de manière répétitive. La plate-forme Java La plate-forme Java est aussi importante que le langage de programmation Java et que la machine virtuelle Java. Tous les programmes écrits dans le langage Java dépendent de l’ensemble des classes prédéfinies qui forment la plate-forme Java. Les classes Java sont 1. Java 5.0 représente un changement significatif dans la numérotation des versions du langage de Sun. La version précédente de Java était la version 1.4, raison pour laquelle Java 5.0 est parfois informellement appelée Java 1.5. 2. NdT : une set-top box est une unité qui permet à une télévision de se transformer en interface utilisateur pour Internet. javaNut.book Page 5 Dimanche, 29. janvier 2006 10:04 22 Qu’est-ce que Java ? 5 Il est important de comprendre ce que signifie le terme plate-forme. Pour un programmeur informatique, une plate-forme est définie par les API sur lesquelles il peut s’appuyer lors de la rédaction de programmes. Ces API sont généralement définies par le système d’exploitation de l’ordinateur cible. Par conséquent, un programmeur écrivant un programme à exécuter sous Microsoft Windows doit utiliser un jeu d’API différent qu’un programmeur écrivant le même programme pour un système Unix. À cet égard, Windows et Unix représentent des plates-formes distinctes. Java n’est pas un système d’exploitation. Néanmoins, la plate-forme Java – en particulier la plate-forme Java 2 – fournit des API dont l’ampleur et la portée sont comparables à celles définies par un système d’exploitation. Avec la plate-forme Java 2, vous pouvez écrire des applications en Java sans faire le sacrifice des caractéristiques avancées à la disposition des programmeurs rédigeant des applications natives ciblées pour un système d’exploitation sous-jacent particulier. Une application écrite sur la plate-forme Java s’exécute sur tout système d’exploitation prenant en charge cette plate-forme. Cela signifie que vous n’avez pas à créer des versions distinctes de votre programme adaptées à Windows, Mac OS et Unix, par exemple. Un seul programme Java s’exécute sur tous ces systèmes d’exploitation, ce qui explique pourquoi « écrire une fois, exécuter partout » est la devise de Sun pour Java. La plate-forme Java ne représente pas un système d’exploitation mais aux yeux des programmeurs, elle représente une cible de développement alternative qui, à ce titre, s’avère très populaire. La plate-forme Java réduit la dépendance des programmeurs visà-vis du système d’exploitation sous-jacent et, en permettant aux programmes de s’exécuter au-dessus de n’importe quel système d’exploitation, elle augmente la liberté des utilisateurs finaux dans leur choix d’un système d’exploitation. Les versions de Java Au moment où ces lignes sont rédigées, il existe six versions principales de Java. Il s’agit de : Java 1.0 Il s’agit de la première version publique de Java. Elle contient 212 classes organisées en 8 paquetages. Cette version offrait simplicité et élégance, mais elle est totalement dépassée aujourd’hui. Java 1.1 Avec cette version, la taille de la plate-forme Java a doublé pour passer à 504 classes réparties en 23 paquetages. Elle a introduit les classes internes, qui représentent un 3. Une classe est un module de code Java qui définit une structure de données et un ensemble de méthodes (également appelées procédures, fonctions ou sous-routines) qui agissent sur ces données. Introduction organisées en groupes apparentés connus sous le nom de paquetages3. La plate-forme Java définit des paquetages pour des fonctionnalités concernant les entrées/sorties, l’interconnexion de réseaux, les composants graphiques, la création d’interfaces utilisateur, la sécurité et plus encore. javaNut.book Page 6 Dimanche, 29. janvier 2006 10:04 22 6 Chapitre 1 : Introduction changement important dans le langage Java et elle présente des améliorations de performance significatives de la VM Java. Cette version est cependant dépassée aujourd’hui. Java 1.2 Il s’agit d’une version importante de Java, qui a triplé la taille de la plate-forme pour atteindre 1520 classes réparties en 59 paquetages. Parmi les nouveautés les plus importantes, citons l’API des collections permettant de travailler avec des ensembles, des listes et des dictionnaires d’objets, ainsi que la nouvelle API Swing pour développer des interfaces utilisateur graphiques. En raison des nombreuses caractéristiques ajoutées dans la version 1.2, la plate-forme fut renommée « plateforme Java 2 ». Cependant, le terme « Java 2 » était simplement une marque de fabrique et pas un véritable numéro de version. Java 1.3 Il s’agit principalement d’une version de maintenance, consacrée à la correction de bogues, à l’amélioration de la stabilité et des performances (notamment grâce à la machine virtuelle de haute performance « HotSpot »). Les nouveautés apportées à la plate-forme incluent les API JNDI et Java Sound, précédemment disponibles sous forme d’extensions. Les nouvelles classes les plus intéressantes sont probablement les classes java.util.Timer et java.lang.reflect.Proxy. Au total, la version 1.3 de la plate-forme Java contient 1842 classes réparties en 76 paquetages. Java 1.4 Il s’agissait d’une autre version majeure ajoutant d’importantes fonctionnalités et accroissant la taille de la plate-forme de 62 %, pour atteindre 2 991 classes et interfaces dans 135 paquetages. Parmi les nouveautés, citons une API d’entrée/sortie de bas niveau et de haute performance ; la prise en charge des mises en correspondance de motifs à l’aide d’expressions régulières ; une API de tenue des journaux de bord ; une API pour la gestion des préférences ; de nouvelles classes de collections ; un mécanisme de persistance basé sur XML pour les JavaBeans ; la prise en charge de l’analyse syntaxique XML en utilisant les API DOM et SAX ; l’authentification des utilisateurs avec l’API JAAS ; la prise en charge des connexions réseau sécurisées en utilisant le protocole SSL ; la prise en charge de la cryptographie ; une nouvelle API pour lire et écrire les fichiers d’images ; un API pour l’impression depuis le réseau ; une poignée de nouveaux composants GUI dans l’API Swing ; une architecture glisser/déposer simplifiée pour Swing. Outre ces modifications apportées à la plateforme, la version 1.4 de Java ajoute l’instruction assert au langage. Java 5.0 La version la plus récente de Java introduit un certain nombre de changements dans le noyau du langage-même, y compris les types génériques, les types énumérés, les annotations, les méthodes à arguments variables (varargs), « l’autoboxing » et une nouvelle instruction for/in. En raison de ces changements majeurs apportés au langage, le numéro de version a été incrémenté. Logiquement, cette version aurait dû s’appeler Java 2.0 si Sun n’avait pas déjà utilisé le terme Java 2 à des fins de marketing pour présenter Java 1.2. javaNut.book Page 7 Dimanche, 29. janvier 2006 10:04 22 Les avantages clés de Java 7 Consultez la préface pour obtenir la liste des changements apportés à cette édition du livre, y compris des pointeurs vers les nouveautés du langage et de la plate-forme. Pour écrire des programmes en Java, vous devez obtenir le kit de développement Java (JDK, pour Java Development Kit). Sun publie une nouvelle version du JDK pour chaque nouvelle version de Java. Ne confondez pas JDK avec l’environnement d’exécution Java (JRE, pour Java Runtime Environment). L’environnement JRE contient tout ce dont vous avez besoin pour exécuter des programmes Java, mais il ne contient pas les outils nécessaires au développement de programmes Java (avant tout le compilateur). Outre l’édition standard de Java utilisée par la plupart des développeurs Java et documentée dans ce livre, Sun publie aussi la plate-forme Java 2, Enterprise Edition (ou J2EE) pour les développeurs de systèmes distribués, et la plate-forme Java 2, Micro Edition (J2ME), pour les appareils électroniques, par exemple les assistants personnels numériques et les téléphones cellulaires. Consultez Java Enterprise in a Nutshell (édition française) et Java Micro Edition in a Nutshell (tous deux chez O’Reilly) pour plus d’informations sur ces autres éditions. Les avantages clés de Java Pourquoi utiliser Java ? Cela vaut-il la peine d’apprendre un nouveau langage et une nouvelle plate-forme ? Cette section explore quelques avantages clés de Java. Écrire une fois, exécuter partout Sun fait de la devise « écrire une fois, exécuter partout » la proposition centrale de la plate-forme Java. Traduite du jargon des affaires, cette maxime signifie que la promesse la plus importante du langage Java consiste à n’écrire votre application qu’une seule fois – pour la plate-forme Java – puis à être en mesure de l’exécuter partout. Partout, sous-entendu partout où la plate-forme Java est prise en charge. Heureusement, la prise en charge de Java devient omniprésente. Java est intégré, ou en phase d’intégration, dans pratiquement tous les systèmes d’exploitation principaux. Il est embarqué au sein des navigateurs web populaires, ce qui le place virtuellement sur chaque PC connecté à Internet dans le monde. Il est même embarqué dans les unités électroniques telles que les set-top box de télévision, les assistants personnels numériques et les téléphones cellulaires. Introduction Outre les changements apportés au langage, Java 5.0 ajoute également plusieurs éléments à la plate-forme Java. Cette version inclut 3562 classes et interfaces au sein de 166 paquetages. Les additions notables incluent des utilitaires pour la programmation concurrente, un cadre de gestion à distance et des classes pour une gestion et une instrumentation à distance de la VM Java elle-même. javaNut.book Page 8 Dimanche, 29. janvier 2006 10:04 22 8 Chapitre 1 : Introduction Sécurité Un autre avantage clé de Java tient à ses caractéristiques en matière de sécurité. Autant le langage que la plate-forme ont été pensés dès leurs origines avec la notion de sécurité à l’esprit. La plate-forme Java permet aux utilisateurs de télécharger du code non fiable sur un réseau et de l’exécuter dans un environnement sécurisé au sein duquel il ne peut pas commettre le moindre dommage : il ne peut pas infecter le système hôte avec un virus, ne peut ni lire, ni écrire dans les fichiers du disque dur, etc. Cette seule aptitude rend la plateforme Java unique. Java 1.2 a poussé le modèle de sécurité un peu plus loin. Elle crée des niveaux de sécurité et des restrictions hautement configurables qu’elle étend au-delà des applets. Dès Java 1.2, tout code Java, qu’il s’agisse d’une applet, d’une servlet, d’un composant JavaBean ou d’une application Java complète, peut être exécuté avec des permissions réduites qui l’empêchent de s’attaquer au système hôte. Les caractéristiques de sécurité du langage et de la plate-forme Java ont fait l’objet d’un examen approfondi par des experts en sécurité du monde entier. Alors que le langage faisait ses premiers pas, plusieurs bogues liés à la sécurité (certains d’entre eux potentiellement sérieux) furent découverts et corrigés. En raison des promesses de Java en matière de sécurité, la découverte d’un nouveau bogue dans ce domaine représente une nouvelle importante. Gardez toutefois à l’esprit qu’aucune autre plate-forme dominante ne peut apporter des garanties de sécurité dont la robustesse approche celles de Java. Personne ne peut affirmer que des failles de sécurité ne seront pas découvertes dans le futur, mais si la sécurité de Java n’est pas encore parfaite, elle s’est révélée suffisamment puissante pour un usage pratique quotidien et certainement supérieure à toute autre alternative. Programmation centrée sur les réseaux La devise d’entreprise de Sun a toujours été « Le réseau est l’ordinateur ». Les concepteurs de la plate-forme Java croient en l’importance de l’interconnexion des réseaux et ils ont conçu la plate-forme Java de telle sorte qu’elle soit centrée sur le réseau. Du point de vue du programmeur, Java facilite incroyablement le travail avec des ressources disséminées sur un réseau ainsi que la création d’applications réseau utilisant des architectures client/ serveur ou multi-utilisateurs. Des programmes dynamiques et extensibles Java est à la fois dynamique et extensible. Le code Java est organisé en unités orientées objet appelées classes. Les classes sont enregistrées dans des fichiers séparés et sont chargées dans l’interpréteur Java uniquement en cas de nécessité. Cela signifie qu’une application peut décider à l’exécution quelles classes sont nécessaires et qu’elle peut les charger au besoin. Cela signifie également qu’un programme peut s’étendre dynamiquement en chargeant les classes dont il a besoin pour étendre ses fonctionnalités. La conception centrée sur le réseau de la plate-forme Java signifie qu’une application Java peut s’étendre dynamiquement en chargeant de nouvelles classes depuis un réseau. Une javaNut.book Page 9 Dimanche, 29. janvier 2006 10:04 22 Les avantages clés de Java 9 Internationalisation Le langage Java ainsi que la plate-forme Java ont été conçus dès le départ avec à l’esprit une ouverture sur le reste du monde. À l’époque de sa création, Java était le seul langage de programmation couramment utilisé possédant des caractéristiques d’internationalisation intégrées plutôt qu’ajoutées après coup. Alors que la plupart des langages de programmation utilisent les caractères encodés sur 8 bits qui ne permettent de représenter que les alphabets anglais et les langues d’Europe de l’ouest, Java utilise les caractères Unicode sur 16 bits qui représentent les alphabets phonétiques ainsi que les jeux de caractères idéographiques du monde entier. Cependant, les caractéristiques d’internationalisation de Java ne sont pas limitées à la représentation de bas niveau des caractères. Ces caractéristiques imprègnent la plate-forme Java, facilitant la rédaction de programmes internationaux avec Java plutôt qu’avec n’importe quel autre environnement. Performances Comme je l’ai décrit précédemment, les programmes Java sont compilés sous une forme intermédiaire portable connue sous le nom de byte-code, plutôt que sous la forme d’instructions en langage machine natif. La machine virtuelle Java exécute un programme Java en interprétant ces instructions byte-code portables. Cette architecture signifie que les programmes Java sont plus rapides que les programmes ou les scripts rédigés dans des langages purement interprétés, mais ils restent d’habitude plus lents que les programmes C et C++ compilés en langage machine natif. Gardez cependant à l’esprit que, bien que les programmes Java soient compilés sous forme de byte-code, toute la plate-forme Java n’est pas implémentée avec du byte-code interprété. Pour des raisons d’efficacité, les portions de la plate-forme Java exigeantes en termes de calcul – telles que les méthodes de manipulation des chaînes de caractères – sont implémentées en code machine natif. Bien que les versions primitives de Java souffrent de problèmes de performance, la vitesse de la VM Java s’est remarquablement améliorée avec chaque nouvelle sortie. La VM a été finement paramétrée et optimisée de diverses manières. De plus, la plupart des mises en œuvre comprennent un compilateur juste-à-temps (JIT) qui convertit sur-le-champ le byte-code Java en instructions machine natives. En utilisant des compilateurs JIT sophistiqués, les programmes Java peuvent s’exécuter à des vitesses comparables à celles d’applications C et C++ natives. Java est un langage portable et interprété ; les programmes Java s’exécutent presque aussi rapidement que les programmes C et C++ natifs et non portables. Par le passé, les questions de performances poussaient certains programmeurs à éviter Java. À présent, avec les améliorations apportées dans Java 1.2, 1.3, 1.4 et 5.0, les problèmes de performances ne doivent plus rebuter quiconque. Introduction application qui tire avantage de ces caractéristiques ne représente plus un bloc de code monolithique. Au lieu de cela, elle se transforme en une collection de composants logiciels capables de dialoguer. Ainsi, Java rend possible un nouveau paradigme de conception et de développement d’applications. javaNut.book Page 10 Dimanche, 29. janvier 2006 10:04 22 10 Chapitre 1 : Introduction Efficacité du programmeur et délai d’arrivée au marché La raison finale, et peut-être la plus importante, justifiant l’utilisation de Java vient du fait que les programmeurs l’aiment. Java est un langage élégant combiné à un jeu d’API puissant et bien conçu. Les programmeurs aiment programmer en Java et sont généralement impressionnés par la rapidité avec laquelle ils peuvent obtenir des résultats. Les études ont constamment montré qu’une migration vers Java augmente l’efficacité des programmeurs. Parce que Java est un langage simple et élégant possédant un jeu d’API bien conçu et intuitif, les programmeurs écrivent un code meilleur comprenant moins de bogues qu’avec d’autres plates-formes, réduisant encore le temps de développement. Un exemple de programme L’exemple 1-1 montre un programme Java de calcul factoriel.4 Les nombres au début de chaque ligne ne font pas partie du programme ; ils ont été ajoutés pour faciliter les références lorsque nous disséquerons le programme ligne par ligne. Exemple 1-1 : Factorial.java : un programme de calcul factoriel 1 /** 2 * Ce programme calcule la valeur factorielle d’un nombre 3 */ 4 public class Factorial { // Définit une classe 5 public static void main(String[] args) { // Ici débute le programme 6 int input = Integer.parseInt(args[0]); // Capture les données d’entrée de l’utilisateur 7 double result = factorial(input); // Calcule la valeur factorielle 8 System.out.println(result); // Affiche le résultat 9 } // Ici s’achève la méthode main() 10 11 public static double factorial(int x) { // Cette méthode calcule x! 12 if (x < 0) // Contrôle si la donnée d’entrée est valable 13 return 0.0; // si elle ne l’est pas, retourne 0 14 double fact = 1.0; // Début du processus avec une valeur initiale 15 while(x > 1) { // Boucle jusqu’à ce que x soit égal à 1 16 fact = fact * x; // multiplie par x à chaque itération 17 x = x - 1; // puis décrémente x 18 } // Retourne au début de la boucle 19 return fact; // Retourne le résultat 20 } // factorial() s’achève ici 21} // La classe s’achève ici Compilation et exécution du programme Avant de voir comment le programme fonctionne, nous devons d’abord parler de son exécution. Afin de compiler et d’exécuter le programme, vous avez besoin d’un kit de développement Java (JDK, pour Java Development Kit). Sun Microsystems a créé le langage 4. Le factoriel d’un nombre entier se calcule par le produit de ce nombre avec tous les entiers positifs inférieurs à ce nombre. Donc, par exemple, le factoriel de 4, que l’on écrit également 4!, correspond à 4 fois 3 fois 2 fois 1, soit 24. Par définition, 0! est égal à 1. javaNut.book Page 11 Dimanche, 29. janvier 2006 10:04 22 Un exemple de programme 11 Le JDK de Sun ne représente pas le seul environnement de programmation Java utilisable. gcj, par exemple, est un compilateur Java distribué sous licence GNU. Un certain nombre de sociétés commercialisent des environnements de développement intégrés (IDE, pour integrated development environments). Il existe également d’excellents IDE libres. Ce livre présuppose que vous utilisez le JDK de Sun et ses outils en ligne de commande. Si vous utilisez un produit provenant d’un autre fournisseur, lisez la documentation de ce fournisseur pour apprendre comment compiler et exécuter un programme simple, tel que celui proposé dans l’exemple 1-1. Une fois votre environnement de programmation Java installé, la première étape en vue de l’exécution de notre programme consiste à le saisir. En utilisant votre éditeur de texte préféré, saisissez le programme tel qu’il est présenté dans l’exemple 1-1. Omettez les numéros de lignes étant donné qu’ils ne se trouvent là qu’à des fins de référence. Notez que Java est un langage sensible au respect des majuscules/minuscules, ce qui signifie que vous devez taper les lettres minuscules en minuscules et les lettres majuscules en majuscules. Vous remarquerez que de nombreuses lignes de ce programme s’achèvent par des points-virgules. Il s’agit d’une erreur courante que d’oublier ces caractères mais le programme ne fonctionnera pas sans eux, aussi soyez prudent ! Si vous n’êtes pas un dactylographe rapide, vous pouvez omettre tout ce qui se trouve entre les caractères // et la fin d’une ligne. Il s’agit de commentaires ; ils se trouvent là pour votre aide et sont ignorés par Java6. Lorsque vous écrivez des programmes Java, vous devez utiliser un éditeur de texte qui sauvegarde les fichiers dans un format textuel pur, non pas un traitement de texte qui prend en charge les polices de caractères et les règles de formatage et qui sauvegarde les fichiers dans un format propriétaire. Mon éditeur de texte favori sur les systèmes Unix est emacs. Si vous utilisez un système Windows, vous devez utiliser Notepad ou WordPad, pour autant que vous ne possédiez pas un éditeur de programmation plus spécialisé (certaines versions de GNU Emacs, par exemple, sont disponibles pour Windows). Si vous utilisez un IDE, ce dernier comprend probablement un éditeur de texte approprié ; consultez la documentation fournie avec le produit. Lorsque vous avez achevé la saisie du programme, enregistrez-le dans un fichier nommé Factorial.java. C’est une étape importante ; le programme ne fonctionnera pas si vous le sauvegardez avec un nom différent. 5. D’autres entreprises, telles qu’Apple, ont acquis une licence et porté le JDK sur leur propre système d’exploitation. Dans le cas d’Apple, cet arrangement génère un délai quant à la disponibilité du JDK le plus récent sur leur plate-forme. 6. Il est conseillé de saisir cet exemple à la main afin de vous habituer au langage. Cependant, si vous ne voulez vraiment pas le saisir, vous pouvez le télécharger, avec tous les autres exemples du livre, à l’adresse http://www.oreilly.com/catalog/ javanut5/. Introduction Java et fournit un JDK gratuit pour son système d’exploitation Solaris ainsi que pour les plates-formes Linux et Microsoft Windows5. Au moment où ces lignes sont rédigées, la version actuelle du JDK de Sun peut être téléchargée à l’adresse http://java.sun.com/. Soyez certains d’obtenir le JDK et non l’environnement d’exécution Java JRE (pour Java Runtime Environment). JRE vous permet d’exécuter des programmes Java existants, mais pas d’écrire et de compiler les vôtres. javaNut.book Page 12 Dimanche, 29. janvier 2006 10:04 22 12 Chapitre 1 : Introduction Après avoir écrit un programme tel que celui-là, la prochaine étape consiste à le compiler. Avec le JDK de Sun, le compilateur Java s’appelle javac. javac est un outil en ligne de commande, ce qui signifie que vous ne pouvez l’utiliser que depuis une fenêtre de terminal telle qu’une fenêtre MS-DOS sur un système Windows ou une fenêtre xterm sur un système Unix. Compilez le programme en tapant la ligne de commande suivante : c:\>javac Factorial.java Si cette commande affiche un quelconque message d’erreur, vous avez probablement commis une erreur lors de la saisie du programme. S’il n’affiche pas de message d’erreur, la compilation a réussi et javac crée un fichier nommé Factorial.class. Il s’agit de la version compilée du programme. Une fois que vous avez compilé un programme Java, vous devez encore l’exécuter. À la différence d’autres langages, les programmes Java ne sont pas compilés en langage machine natif, donc ils ne peuvent pas être directement exécutés par le système. En lieu et place, ils sont exécutés par un autre programme connu sous le nom d’interpréteur Java. Dans le JDK de Sun, l’interpréteur est un programme en ligne de commande appelé, de manière assez appropriée, java. Pour exécuter le programme de calcul factoriel, tapez : c:\>java Factorial 4 java est la commande qui exécute l’interpréteur Java, Factorial est le nom du programme Java qui doit être exécuté par l’interpréteur et 4 représente la donnée d’entrée - le nombre pour lequel nous souhaitons que l’interpréteur calcule la valeur factorielle. Le programme affiche une seule ligne de sortie, nous indiquant que la factorielle de 4 est 24 : c:\>java Factorial 4 24.0 Félicitations ! Vous venez d’écrire, compiler et exécuter votre premier programme Java. Essayez de l’exécuter à nouveau pour calculer les valeurs factorielles d’autres nombres. Analyse du programme Maintenant que vous avez exécuté le programme de calcul factoriel, analysons-le ligne par ligne pour découvrir comment fonctionne un programme Java. Commentaires Les trois premières lignes du programme représentent un commentaire. Java les ignore mais elles indiquent à un programmeur ce que fait le programme. Un commentaire commence par les caractères /* et se termine par les caractères */. Une quantité de texte quelconque, y compris sur des lignes multiples, peut apparaître entre ces caractères. Java prend également en charge un autre type de commentaire que vous découvrez sur les lignes 4 à 21. Si les caractères // apparaissent dans un programme Java, Java les ignore, ainsi que tout autre texte qui apparaît entre ces caractères et la fin de la ligne. javaNut.book Page 13 Dimanche, 29. janvier 2006 10:04 22 Un exemple de programme 13 La ligne 4 représente le début du programme. Elle indique que nous définissons une classe appelée Factorial. Cela explique pourquoi le programme doit être enregistré dans un fichier nommé Factorial.java. Ce nom de fichier indique que le fichier contient le code source Java d’une classe nommée Factorial. Le mot public est un modificateur ; il indique que la classe est publiquement disponible et que n’importe qui peut l’utiliser. L’accolade ouvrante ({) marque le début du corps de la classe, qui s’étend jusqu’à la ligne 21 sur laquelle nous trouvons l’accolade fermante (}) correspondante. Le programme contient un certain nombre de paires d’accolades ; les lignes sont indentées pour faire ressortir l’emboîtement au sein de ces accolades. Une classe représente l’unité fondamentale de la structure d’un programme Java, aussi n’est-il pas surprenant que la première ligne de notre programme déclare une classe. Tous les programmes Java sont des classes, bien que certains programmes utilisent de nombreuses classes plutôt qu’une seule. Java est un langage de programmation orienté objet et les classes représentent un élément fondamendal du paradigme orienté objet. Chaque classe définit un type d’objet unique. Cependant, l’exemple 1-1 ne représente pas vraiment un programme orienté objet, raison pour laquelle je n’entrerai pas maintenant dans les détails des classes et des objets. Il s’agit du thème du chapitre 3, La programmation orientée objet en Java. Pour l’heure, tout ce que vous devez comprendre est qu’une classe définit un jeu de membres qui interagissent. Ces membres peuvent être des champs, des méthodes ou d’autres classes. La classe Factorial contient deux membres qui sont tous deux des méthodes. Ils sont décrits dans les sections qui suivent. Définition d’une méthode La ligne 5 commence par la définition d’une méthode de notre classe Factorial. Une méthode correspond à une partie nommée de code Java. Un programme Java peut appeler, ou invoquer, une méthode afin d’exécuter le code qu’elle contient. Si vous avez programmé avec d’autres langages, vous avez probablement rencontré des méthodes auparavant, mais on les appelait peut-être fonctions, procédures ou sous-routines. L’intérêt des méthodes est qu’elles possèdent des paramètres et des valeurs de retour. Lorsque vous appelez une méthode, vous lui passez des données sur lesquelles vous souhaitez qu’elle agisse puis elle vous retourne un résultat. Une méthode ressemble à une fonction algébrique : y = f(x) Dans ce cas, la fonction mathématique f exécute un calcul sur la valeur représentée par x et renvoie une valeur que nous représentons par y. Les mots clés public et static de la ligne 5 sont des modificateurs. public signifie que la méthode est accessible publiquement ; chacun peut l’utiliser. La signification du modificateur static n’est pas importante ici ; elle sera expliquée au chapitre 3. Le mot clé void (en français, vide) spécifie la valeur de retour de la méthode. Dans ce cas, elle spécifie que cette méthode ne possède pas de valeur de retour. Introduction Définition d’une classe javaNut.book Page 14 Dimanche, 29. janvier 2006 10:04 22 14 Chapitre 1 : Introduction Le mot main (qui signifie principal en français) est le nom de la méthode7. main correspond à un nom particulier. Lorsque vous exécutez l’interpréteur Java, ce dernier lit et place en mémoire la classe que vous spécifiez puis cherche une méthode appelée main()8. Lorsque l’interpréteur trouve cette méthode, il s’en sert pour débuter l’exécution du programme. Lorsque la méthode main() s’achève, le programme est terminé et l’interpréteur Java stoppe son exécution. En d’autres termes, la méthode main() représente le point d’entrée principal dans un programme Java. Cependant, il n’est habituellement pas suffisant pour une méthode d’être nommée main(). La méthode doit être déclarée public static void exactement comme indiqué sur la ligne 5. En fait, la seule partie de la ligne 5 que vous pouvez modifier est le mot args (diminutif d’arguments) que vous pouvez remplacer par l’identificateur de votre choix. Vous utiliserez cette ligne dans tous vos programmes Java, aussi apprenez-la par cœur dès maintenant ! À la suite du nom de la méthode main() se trouve une liste de paramètres de méthode, délimitée par des parenthèses. Notre méthode main() ne possède qu’un seul paramètre. String[] spécifie le type du paramètre, à savoir un tableau de chaînes de caractères (c’est-àdire une liste numérotée de chaînes de texte). args spécifie le nom du paramètre. Dans l’équation algébrique f(x), x permet simplement de faire référence à une valeur inconnue. args poursuit le même but pour la méthode main(). Comme nous le verrons plus tard, le nom args est utilisé dans le corps de la méthode pour faire référence à la valeur inconnue transmise à la méthode. Comme je viens de l’expliquer, la méthode main() est une méthode particulière appelée par l’interpréteur Java lorsqu’il commence à exécuter une classe (ou un programme) Java. Lorsque vous invoquez l’interpréteur Java de la manière suivante : C:\>java Factorial 4 la chaîne de caractères « 4 » est transmise à la méthode main() comme valeur associée au paramètre nommé args. De façon plus précise, un tableau de chaînes de caractères contenant une seule entrée, « 4 », est transmis à main(). Si nous invoquons le programme de la manière suivante : C:\>java Factorial 4 3 2 1 alors un tableau de quatre chaînes de caractères, « 4 », « 3 », « 2 » et « 1 » est passé à la méthode main() comme valeur associée au paramètre nommé args. Notre programme ne s’intéresse qu’à la première chaîne de caractères dans le tableau, aussi les autres chaînes sont-elles ignorées. 7. Tous les programmes Java qui sont exécutés directement par l’interpréteur Java doivent posséder une méthode main(). Les programmes de ce genre sont souvent appelés des applications. Il est possible d’écrire des programmes qui ne sont pas exécutés directement par l’interpréteur, mais qui sont chargés dynamiquement dans un autre programme Java déjà en cours d’exécution. Un exemple concerne les applets, qui sont des programmes exécutés par un navigateur web, ainsi que les servlets, qui sont des programmes exécutés par un serveur web. Les applets sont traités dans Java Foundation Classes in a Nutshell, édition française (O’Reilly) et les servlets dans Java Enterprise in a Nutshell (O’Reilly). Au sein du présent ouvrage, nous ne considérons que les applications. 8. Par convention, lorsque ce livre fait référence à une méthode, il fait suivre le nom de la méthode par une paire de parenthèses. Comme vous le verrez, les parenthèses représentent une partie importante de la syntaxe d’une méthode et elles sont utilisées ici pour distinguer les noms des méthodes des noms des classes, des champs, des variables, etc. javaNut.book Page 15 Dimanche, 29. janvier 2006 10:04 22 Un exemple de programme 15 Déclaration d’une variable et analyse des données d’entrée La première instruction de la méthode main(), à la ligne 6, déclare une variable et lui assigne une valeur. Dans tout langage de programmation, une variable est simplement un nom symbolique associé à une valeur. Nous avons déjà vu que, dans ce programme, le nom args fait référence aux valeurs des paramètres transmis à la méthode main(). Les paramètres d’une méthode représentent un type de variable. Il s’avère également possible pour les méthodes de déclarer des variables « locales » supplémentaires. Les méthodes peuvent utiliser les variables locales pour enregister et référencer des valeurs intermédiaires qu’elles utilisent pendant leurs opérations. Il s’agit exactement de l’approche adoptée sur la ligne 6. Cette ligne commence par les mots int input qui déclare une variable nommée input et spécifie que la variable est du type int ; cela signifie qu’il s’agit d’un nombre entier9. Java peut travailler avec plusieurs types de valeurs différents, y compris les nombres entiers, réels ou à virgule f lottante, les caractères (par exemple les lettres, les chiffres) et les chaînes de caractères. Java est un langage fortement typé, ce qui signifie que toutes les variables doivent posséder un type spécifié et ne peuvent faire référence qu’à des valeurs de ce type. Notre variable input fait toujours référence à un nombre entier ; elle ne peut pas faire référence à un nombre à virgule flottante ou à une chaîne de caractères. Les paramètres des méthodes sont également typés. Rappelez-vous que le paramètre args était du type String[]. Si l’on continue avec la ligne 6, on découvre que la déclaration de variable int input est suivie par le caractère =. Il s’agit de l’opérateur d’affectation en Java ; il définit la valeur d’une variable. Lorsque vous lisez du code Java, ne lisez pas = comme « égal à » mais lisezle plutôt comme « reçoit la valeur ». Comme nous le verrons au chapitre 2, la syntaxe Java, il existe un opérateur différent pour exprimer l’égalité. La valeur affectée à notre variable input est Integer.parseInt(args[0]). Il s’agit d’une invocation de méthode. Cette première instruction de la méthode main() invoque une autre méthode dont le nom est Integer.parseInt(). Comme vous pouvez l’imaginer, cette méthode « analyse » (parse en anglais) un entier ; cela signifie qu’elle convertit une représentation d’un nombre entier sous forme de chaîne de caractères (string en anglais), par exemple « 4 », en un véritable nombre entier (integer en anglais). La méthode 9. NdT : int est l’abbréviation de integer, c’est-à-dire entier Introduction Enfin, le dernier élément de la ligne 5 est une accolade ouvrante. Elle marque le début du corps de la méthode main(), lequel s’étend jusqu’à l’accolade fermante correspondante, à la ligne 9. Les méthodes sont composées d’instructions que l’interpréteur Java exécute en ordre séquentiel. Dans notre cas, les lignes 6, 7 et 8 représentent trois instructions qui forment le corps de la méthode main(). Chaque instruction se termine par un point-virgule qui la sépare de la prochaine instruction. Il s’agit d’une partie importante de la syntaxe de Java ; les programmeurs débutants oublient souvent les points-virgules. javaNut.book Page 16 Dimanche, 29. janvier 2006 10:04 22 16 Chapitre 1 : Introduction Integer.parseInt() ne fait pas partie du langage Java mais représente un élément de base de l’API ou Application Programming Interface (pour interface de programmation d’applications) Java. Chaque programme Java peut utiliser l’ensemble puissant des classes et des méthodes définies par ces API essentielles. La deuxième moitié de ce livre prend la forme d’un guide de référence qui documente ces API essentielles. Lorsque vous appelez une méthode, vous lui transmettez des valeurs (appelés arguments) qui sont affectées aux paramètres correspondants définis par la méthode, puis la méthode retourne elle-même une valeur. L’argument transmis à Integer.parseInt() est args[0]. Rappelez-vous que args est le nom du paramètre de main() ; il spécifie un tableau (ou liste) de chaînes de caractères. Les éléments d’un tableau sont numérotés séquentiellement et le premier porte toujours le numéro 0. Nous ne nous intéressons qu’à la première chaîne de caractères du tableau args, aussi utilisons-nous l’expression args[0] pour faire précisément référence à cette chaîne de caractères. Donc, lorsque nous invoquons le programme tel que montré précédemment, la ligne 6 prend la première chaîne de caractères spécifiée après le nom de la classe, soit « 4 », et la transmet à la méthode nommée Integer.parseInt(). Cette méthode convertit la chaîne de caractères en un nombre entier équivalent et renvoie cet entier comme valeur de retour. Enfin, l’entier retourné est affecté à la variable nommée input. Calcul du résultat L’instruction de la ligne 7 ressemble beaucoup à l’instruction de la ligne 6. Elle déclare une variable et lui affecte une valeur. La valeur affectée à la variable est calculée par l’invocation d’une méthode. La variable s’appelle result et est du type double. double correspond à un nombre à virgule flottante en double précision. La variable reçoit une valeur calculée par la méthode factorial(). La méthode factorial(), cependant, ne fait pas partie de l’API Java standard. Elle est définie comme partie intégrante de notre programme aux lignes 11 à 19. L’argument transmis à factorial() n’est autre que la valeur à laquelle fait référence la variable input qui a été calculée à la ligne 6. Nous considérerons le corps de la méthode factorial() brièvement, mais vous pouvez deviner d’après son nom que cette méthode prend une valeur d’entrée, calcule la factorielle de cette valeur puis retourne le résultat. Affichage du résultat La ligne 8 appelle simplement une méthode nommée System.out.println(). Cette méthode couramment utilisée fait partie de l’API essentielle de Java ; elle indique à l’interpréteur Java qu’il y a lieu d’afficher une valeur. Dans ce cas, la valeur qu’elle affiche est la valeur référencée par la variable nommée result. Il s’agit du résultat de notre calcul factoriel. Si la variable input contient la valeur 4, la variable result contient la valeur 24 et la ligne 8 provoque l’affichage de cette valeur. La méthode System.out.println() n’a pas de valeur de retour, aussi n’y a-t-il pas de déclaration de variable ou d’opérateur d’affectation dans cette instruction, étant donné qu’il n’y a aucune valeur à assigner à quoi que ce soit. En d’autres termes, tout comme la méthode main() de la ligne 5, System.out.println() est déclarée void. javaNut.book Page 17 Dimanche, 29. janvier 2006 10:04 22 Un exemple de programme 17 La ligne 9 ne contient qu’un seul caractère, }. Ce dernier marque la fin de la méthode. Lorsque l’interpréteur Java arrive à cet endroit, il a terminé l’exécution de la méthode main() et stoppe donc son exécution. La fin de la méthode main() représente également la frontière de la portée des variables input et result déclarées au sein de main(), ainsi que du paramètre args de main(). Ces noms de variables et de paramètres n’ont un sens qu’au sein de la méthode main() et ne peuvent pas être utilisés ailleurs dans le programme, à moins que d’autres parties du programme ne déclarent des variables ou des paramètres différents qui possèdent par hasard le même nom. Lignes vides La ligne 10 est un ligne vide. Vous pouvez insérer des lignes vides, des espaces et des tabulateurs n’importe où dans un programme et vous devez même généreusement les utiliser pour améliorer la lisibilité du code. Une ligne vide à cet endroit sépare la méthode main() de la méthode factorial() qui débute à la ligne 11. Vous remarquerez que le programme utilise également des espaces et des tabulateurs afin d’indenter les diverses lignes de code. Ce type d’indentation est facultatif ; il accentue la structure du programme et améliore nettement la lisibilité du code. Une autre méthode La ligne 11 marque le début de la définition de la méthode factorial() utilisée par la méthode main(). Comparez cette ligne à la ligne 5 et notez les points communs ainsi que les différences. La méthode factorial() possède les mêmes modificateurs public et static que la méthode main(). Elle prend un seul paramètre de type entier que nous appelons x. À la différence de la méthode main() qui ne possède pas de valeur de retour (void), factorial() retourne une valeur de type double. L’accolade ouvrante marque le début du corps de la méthode qui englobe les accolades emboîtées des lignes 15 et 18 et se poursuit jusqu’à la ligne 20 sur laquelle se trouve l’accolade fermante correspondante. Le corps de la méthode factorial(), tout comme le corps de la méthode main(), est formé d’instructions que l’on trouve aux lignes 12 à 19. Contrôle de validité des données d’entrée Dans la méthode main(), nous avons vu des déclarations de variables, des affectations ainsi que des invocations de méthodes. L’instruction de la ligne 12 est différente. Il s’agit d’une instruction if (en français, if signifie si) dont le rôle est d’exécuter une autre instruction de manière conditionnelle. Nous avons vu plus tôt que l’interpréteur Java exécute les trois instructions de la méthode main() les unes après les autres. Il les exécute toujours de cette manière, exactement dans cet ordre. Une instruction if est une instruction de contrôle de flux ; elle peut inf luencer la manière dont l’interpréteur exécute un programme. Le mot clé if est suivi d’une expression entre parenthèses et d’une instruction. L’interpréteur Java commence par évaluer l’expression. Si celle-ci est vérifiée (valeur booléenne true), l’interpréteur exécute l’instruction. Cependant, si l’expression est fausse (false), l’interpréteur passe l’instruction et passe à la suivante. La condition de l’instruction if de Introduction Fin d’une méthode javaNut.book Page 18 Dimanche, 29. janvier 2006 10:04 22 18 Chapitre 1 : Introduction la ligne 12 s’exprime par x < 0. Elle contrôle que la valeur transmise à la méthode factorial() est inférieure à zéro. Si tel est le cas, l’expression est considérée comme vraie (true) et l’instruction de la ligne 13 est exécutée. La ligne 12 ne se termine pas par un point-virgule car l’instruction de la ligne 13 fait partie de l’instruction if. Les pointsvirgules ne sont nécessaires qu’à la fin d’une instruction. La ligne 13 représente une instruction return. Elle indique que la valeur de retour de la méthode factorial() est 0.0. return est également une instruction de contrôle de f lux. Lorsque l’interpréteur Java rencontre un return, il stoppe l’exécution de la méthode courante et retourne immédiatement la valeur spécifiée. Une instruction return peut être autonome mais dans le cas présent, l’instruction return fait partie de l’instruction if de la ligne 12. L’indentation de la ligne 13 aide à accentuer ce fait. (Java ignore l’indentation mais elle s’avère très utile pour les humains qui lisent du code Java !) La ligne 13 n’est exécutée que si l’expression de la ligne 12 est vraie (true). Avant de continuer, nous devrions prendre un peu de recul et discuter en premier lieu de la nécessité des lignes 12 et 13. Il est erroné d’essayer de calculer la factorielle d’un nombre négatif, aussi ces lignes contrôlent-elles que la valeur d’entrée x est valable. Si ce n’est pas le cas, ces lignes forcent factorial() à retourner un résultat invalide mais cohérent, 0.0. Une variable importante La ligne 14 représente une autre déclaration de variable ; elle déclare une variable nommée fact, de type double, et lui affecte la valeur initiale 1.0. Cette variable contient la valeur de la factorielle que nous calculons lors des instructions qui suivent. Dans Java, les variables peuvent être déclarées n’importe où ; leur déclaration n’est pas limitée au début d’une méthode ou d’un bloc de code. Boucle et calcul factoriel La ligne 15 présente un nouveau type d’instruction : la boucle while (en français, while signifie tant que). À la manière d’une instruction if, une instruction while est formée d’une expression entre parenthèses et d’une instruction. Lorsque l’interpréteur Java rencontre une instruction while, il évalue l’expression associée. Si l’évaluation de cette expression retourne la valeur vraie (true), l’interpréteur exécute l’instruction. L’interpréteur répète ce processus, évaluant l’expression et exécutant l’instruction si l’expression est vraie jusqu’à ce que l’expression soit évaluée comme étant fausse (false). L’expression de la ligne 15 s’exprime par x > 1, aussi l’instruction while se met-elle en boucle tant que le paramètre x contient une valeur plus grande que 1. En d’autres termes, la boucle se répète jusqu’à ce que x contienne une valeur inférieure ou égale à 1. Nous pouvons présupposer de cette expression que si l’on veut que la boucle s’achève un jour, la valeur de x doit être modifiée d’une manière ou d’une autre par l’instruction que la boucle exécute. La différence principale entre l’instruction if des lignes 12-13 et la boucle while des lignes 15-18 vient du fait que l’instruction associée à la boucle while est une instruction composée. Une instruction composée est formée de zéro, une ou plusieurs instructions groupées entre accolades. Le mot clé while de la ligne 15 est suivi d’une expression entre parenthèses puis par une accolade ouvrante. Cela signifie que le corps de la boucle est javaNut.book Page 19 Dimanche, 29. janvier 2006 10:04 22 Un exemple de programme 19 Le corps de la boucle while est formé par les instructions des lignes 16 et 17. La ligne 16 multiplie la valeur de fact par la valeur de x et enregistre le résultat dans fact. La ligne 17 est du même genre. Elle soustrait 1 de la valeur de x et enregistre le résultat dans x. Le caractère * sur la ligne 16 est important : il représente l’opérateur de multiplication. Et, comme vous le devinerez probablement, le - sur la ligne 17 représente l’opérateur de soustraction. Un opérateur est un élément clé de la syntaxe de Java : il exécute un calcul sur un ou deux opérandes afin de produire une nouvelle valeur. Les opérandes et les opérateurs se combinent pour former des expressions telles que fact * x ou x - 1. Nous avons vu d’autres opérateurs au sein du programme. La ligne 15, par exemple, utilise l’opérateur « plus grand que » (>) dans l’expression x > 1 qui compare la valeur de la variable x à 1. La valeur de cette expression est une valeur de vérité booléenne - soit true (vrai) ou false (faux) en fonction du résultat de la comparaison. Afin de comprendre cette boucle while, il est utile de penser de la même façon que l’interpréteur Java. Supposons que nous essayions de calculer la factorielle de 4. Avant le début de la boucle, fact possède la valeur 1.0 et x la valeur 4. Après que le corps de la boucle a été exécuté une fois – après la première itération – fact possède la valeur 4.0 et x la valeur 3. Après la seconde itération, fact possède la valeur 12.0 et x la valeur 2. Après la troisième itération, fact possède la valeur 24.0 et x la valeur 1. Lorsque l’interpréteur teste la condition de boucle après la troisième itération, il constate que l’expression x > 1 n’est plus vérifiée, aussi stoppe-t-il l’exécution de la boucle et le programme reprend à la ligne 19. Retourner le résultat La ligne 19 représente une autre instruction return, comparable à celle que nous avons rencontrée à la ligne 13. Celle-ci ne retourne pas une valeur constante telle que 0.0 mais retourne plutôt la valeur de la variable fact. Si la valeur de x transmise dans la fonction factorial() est 4, alors, comme nous l’avons vu précédemment, la valeur de fact est égale à 24.0, aussi s’agit-il de la valeur retournée. Rappelez-vous que la méthode factorial() a été invoquée à la ligne 7 du programme. Lorsque cette instruction return est exécutée, le contrôle retourne à la ligne 7, où la valeur de retour est affectée à la variable nommée result. Exceptions Si vous avez effectué cette analyse de l’exemple 1-1 ligne par ligne jusqu’à son terme, vous êtes sur le bon chemin pour comprendre les fondements du langage Java10. Il s’agit d’un programme simple, bien que non trivial, qui illustre de nombreuses caractéristiques de Java. Il existe une caractéristique supplémentaire importante de la programmation Java que je souhaite présenter mais qui n’apparaît pas dans l’énoncé du programme lui-même. Rappelez-vous que le programme calcule la factorielle du nombre que vous spécifiez sur la Introduction formé de toutes les instructions entre cette accolade ouvrante et l’accolade fermante correspondante de la ligne 18. Plus tôt dans ce chapitre, j’ai indiqué que toutes les instructions Java se terminent par des points-virgules. Cependant, cette règle ne s’applique pas aux instructions composées comme vous pouvez le constater par l’absence de pointvirgule à la fin de la ligne 18. Les instructions au sein d’un instruction composée (lignes 16 et 17) s’achèvent par des points-virgules, bien évidemment. javaNut.book Page 20 Dimanche, 29. janvier 2006 10:04 22 20 Chapitre 1 : Introduction ligne de commande. Que se passe-t-il si vous exécutez le programme sans spécifier de nombre ? C:\> java Factorial java.lang.ArrayIndexOutOfBoundsException: 0 at Factorial.main(Factorial.java:6) C:\> Et que se passe-t-il si vous spécifiez une valeur qui n’est pas un nombre ? C:\>java Factorial dix java.lang.NumberFormatException: dix at java.lang.Integer.parseInt(Integer.java) at java.lang.Integer.parseInt(Integer.java) at Factorial.main(Factorial.java:6) Dans les deux cas, une erreur se produit ou, dans la terminologie de Java, une exception est levée. Lorsqu’une exception est levée, l’interpréteur Java affiche un message qui explique de quel type d’exception il s’agit et à quel moment elle s’est produite (les deux exceptions ci-dessus se sont produites à la ligne 6). Dans le premier cas, l’exception est levée parce qu’il n’y a pas de chaîne de caractères dans la liste d’arguments args, signifiant par là que nous essayons d’accéder avec args[0] à une chaîne de caractères inexistante. Dans le deuxième cas, l’exception est levée parce que Integer.parseInt() est incapable de convertir la chaîne de caractères « dix » en un nombre. Nous en apprendrons davantage au sujet des exceptions dans le chapitre 2 et nous verrons comment les traiter élégamment lorsqu’elles se produisent. 10. Si vous n’avez pas saisi tous les détails de ce programme de calcul factoriel, ne vous inquiétez pas. Nous traiterons les détails du langage Java de manière plus minutieuse dans les chapitres 2 et 3. Cependant, si vous avez l’impression de ne rien comprendre à cette analyse ligne par ligne, vous pourriez également avoir le sentiment que les prochains chapitres vous dépassent complètement. Dans ce cas, vous devez probablement étudier ailleurs les fondements du langage Java puis revenir à ce livre pour renforcer vos connaissances et, bien sûr, pour l’utiliser comme guide de référence. Une ressource qui pourrait vous sembler intéressante pour l’apprentissage du langage est le tutoriel Java en ligne de Sun, disponible à l’adresse http://java.sun.com/docs/books/tutorial/.