Vous savez dĂ©jĂ programmer. Dans ce chapitre, vous allez dĂ©couvrir ce qui est propre Ă Java : comment un programme se compile et sâexĂ©cute, comment vous organisez votre code, comment vous manipulez des donnĂ©es, puis comment vous Ă©crivez un programme complet.
Points essentiels- JVM, bytecode, JDK / JRE,
javac/java - Classe,
main,package,import(y compris*) - Types primitifs, variables (nommage, mots-clés), conversions et cast
- Références,
null, autoboxing,String(==/equals),parseInt enum,final, portée, valeurs par défaut- Opérateurs,
print/println/printf,if/switch, boucles, tableaux Scanner, argumentsargs, commentaires et Javadoc
1.1Plateforme
1.1.1 â JVM et bytecode
Quand vous compilez un fichier Java, vous nâobtenez pas un programme rĂ©servĂ© Ă Windows, macOS ou Linux.
Le compilateur produit du bytecode : un code intermédiaire, identique pour toutes les
machines. Ce bytecode est stocké dans des fichiers .class.
RĂŽle de la machine virtuelle
Qui exécute ce bytecode, alors ? La JVM (Java Virtual Machine).
Câest un programme installĂ© sur votre ordinateur. Elle lit le bytecode et lâexĂ©cute.
En dâautres termes, elle sert dâintermĂ©diaire entre le fichier .class et le systĂšme
dâexploitation :
- elle charge les classes et lance la méthode
main; - elle traduit le bytecode en instructions que la machine peut vraiment exécuter ;
- elle gÚre la mémoire (notamment le ramasse-miettes) ;
- elle masque les différences entre les systÚmes (fichiers, processus, etc.).
Sans JVM, un fichier .class ne sâexĂ©cute pas.
La commande java démarre précisément cette machine virtuelle.
ExĂ©cution indĂ©pendante du systĂšme dâexploitation
Vous compilez une seule fois.
Le fichier .class obtenu nâest ni un .exe Windows ni un binaire Linux :
câest du bytecode portable. Vous pouvez donc copier la mĂȘme archive sur un autre systĂšme.
LâexĂ©cution ne dĂ©pend pas de lâOS, Ă condition quâune JVM y soit installĂ©e.
Câest la portabilitĂ© de Java : votre programme ne « parle » pas Ă Windows ou Ă Linux, il parle Ă la JVM. Chaque systĂšme a sa propre JVM ; le bytecode, lui, ne change pas.
Fichier .java â javac â Fichier .class (bytecode) â JVM â exĂ©cution
.class, non.
1.1.2 â JDK, JRE, javac et java
Quatre noms reviennent souvent. Ne les mélangez pas. Pour écrire et compiler du code, vous avez besoin du JDK. Pour seulement lancer un programme déjà compilé, le JRE suffit.
| Outil | RĂŽle |
|---|---|
| JDK | Kit de développement : compilateur + JVM + bibliothÚques |
| JRE | Exécution uniquement (JVM + bibliothÚques), sans javac |
| javac | Compile un fichier .java en fichier .class |
| java | Lance la JVM sur une classe qui contient main |
javac App.java
java App
1.1.3 â Classe, mĂ©thode main, fichier source
En Java, tout votre code se trouve dans une classe.
Pour lancer un programme, la JVM cherche une méthode bien précise : main.
Câest le point dâentrĂ©e.
Une classe public doit ĂȘtre dans un fichier du mĂȘme nom.
Par exemple, la classe App se place dans le fichier App.java.
Par convention, le nom dâune classe commence par une majuscule
(PascalCase) : App, Livre, UserService.
Voyons un programme minimal.
public class App {
public static void main(String[] args) {
System.out.println("Hello");
}
}
main, affichage
(cliquer pour agrandir).public static void main(String[] args).
Câest cette mĂ©thode que la JVM appelle au dĂ©marrage.
Le tableau args contient les arguments passés en ligne de commande (voir 1.3.7).
1.1.4 â package et import
DĂšs que le projet grandit, une seule classe ne suffit plus.
Java range les classes dans des package â tout simplement des dossiers.
La premiÚre ligne du fichier déclare le package.
Le nom du package doit correspondre au chemin des dossiers :
le package app.model se place dans le dossier app/model/.
Par convention, un nom de package sâĂ©crit en minuscules :
app, app.model â pas App.Model.
Pour utiliser une classe qui se trouve dans un autre package, vous avez deux possibilités.
Vous pouvez écrire le nom complet à chaque fois.
Ou bien vous ajoutez un import, puis vous utilisez le nom court.
En pratique, lâimport est plus lisible.
java.util.Scanner in = new java.util.Scanner(System.in); // sans import
Import dâune classe
package app;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println(in.nextLine());
in.close();
}
}
Quand vous compilez et lancez le programme, vous devez tenir compte du package :
javac app/App.java
java app.App
Import avec *
Vous nâavez pas envie dâĂ©crire chaque classe une par une ?
LâĂ©criture import java.util.* importe toutes les classes
du package java.util, par exemple Scanner, Random ou
Date.
import java.util.*;
public class App {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Random r = new Random();
System.out.println(in.nextLine() + " " + r.nextInt(10));
in.close();
}
}
* ne descend pas dans les sous-packages.
Ainsi, import java.util.* nâimporte pas
java.util.concurrent.ConcurrentHashMap.
Il faudrait écrire import java.util.concurrent.*, ou importer directement la classe.
import java.lang.*.En projet, on prĂ©fĂšre souvent un import explicite pour chaque classe : câest plus lisible. LâĂ©toile reste pratique en cours, ou quand un fichier utilise beaucoup de classes du mĂȘme package.
1.2Données
Un programme manipule des valeurs. En Java, vous distinguez deux grandes familles : les valeurs simples (un entier, un boolĂ©enâŠ) et les objets. Commençons par les valeurs simples.
1.2.1 â Types primitifs
Java propose huit types primitifs.
En pratique, vous utiliserez surtout int, double, boolean et
char.
| Type | Usage | Valeur par défaut | Exemple |
|---|---|---|---|
| int | Entier par défaut | 0 |
int n = 10; |
| long | Grand entier (suffixe L) |
0L |
long x = 8_000_000_000L; |
| double | Nombre décimal par défaut | 0.0 |
double p = 3.14; |
| float | Décimal 32 bits (suffixe f) |
0.0f |
float f = 1.5f; |
| boolean | Vrai ou faux | false |
boolean ok = true; |
| char | Un caractĂšre Unicode | '\u0000' |
char c = 'A'; |
| byte, short | Entiers plus petits â rarement nĂ©cessaires | 0 |
byte b = 120; |
Avez-vous remarquĂ© la colonne « valeur par dĂ©faut » ? Elle concerne les attributs dâune classe (voir 1.2.9). Une variable locale nâa pas de valeur par dĂ©faut : vous devez lâinitialiser vous-mĂȘme.
1.2.2 â Variables
Une variable associe un nom Ă une valeur dâun certain type. Pour la dĂ©clarer, vous Ă©crivez le type, puis le nom, puis Ă©ventuellement une valeur initiale. Choisissez un nom clair : il doit dĂ©crire ce que contient la variable.
int annee = 2026;
double prix = 12.5;
boolean dispo = true;
String titre = "Dune";
Nommage
Un nom de variable peut contenir des lettres, des chiffres, _ et $.
Il ne doit pas commencer par un chiffre.
Java distingue les majuscules et les minuscules : annee et Annee sont deux
variables différentes.
Par convention, vous écrivez les variables et les méthodes en
camelCase : nbLivres, titreDuLivre,
afficherTitre.
int nbLivres = 3; // OK
int 2titres = 3; // â interdit : commence par un chiffre
int titre-livre = 1; // â interdit : tiret
Mots-clés à éviter
Un nom de variable ne peut pas ĂȘtre un mot rĂ©servĂ© du langage.
Des mots comme class, new ou int sont déjà pris par Java.
| Famille | Exemples (interdits comme nom) |
|---|---|
| Types | int, double, boolean, void,
class, enum |
| ContrĂŽle | if, else, for, while,
switch, return, break |
| Autres | public, static, new, package,
import, final, this, null,
true, false |
int class = 1; // â interdit
int new = 2; // â interdit
int classe = 1; // OK : ce nâest pas le mot-clĂ© class
1.2.3 â Conversions et cast
Un int tient facilement dans un double : Java fait la conversion tout seul.
On parle dâĂ©largissement.
Lâinverse est plus dĂ©licat : vous pouvez perdre de lâinformation.
Dans ce cas, vous devez écrire un cast explicite.
int n = 10;
double d = n; // OK : 10.0
double x = 3.9;
int k = (int) x; // 3 : la partie décimale est perdue
int grand = 300;
byte b = (byte) grand; // débordement possible : résultat trompeur
| Sens | Ăcriture | Risque |
|---|---|---|
int â double |
automatique | Aucun |
double â int |
(int) |
Troncature, pas dâarrondi |
| type Ă©troit â type large | cast obligatoire | DĂ©bordement silencieux |
(int) 3.9 donne 3, pas
4. La partie décimale est simplement coupée.
1.2.4 â RĂ©fĂ©rences et null
Tout ce qui nâest pas un type primitif est un objet. Imaginez une fiche de bibliothĂšque : la fiche nâest pas le livre, elle indique oĂč le trouver. Une variable objet fonctionne de la mĂȘme façon : elle contient une rĂ©fĂ©rence (une adresse en mĂ©moire), pas lâobjet lui-mĂȘme.
String a = "Java"; // a référence un objet String
String b = a; // b rĂ©fĂ©rence le mĂȘme objet
a = null; // a ne rĂ©fĂ©rence plus rien ; lâobjet peut rester atteint via b
Comme vous pouvez le voir sur le schĂ©ma, plusieurs variables peuvent pointer vers le mĂȘme objet.
null signifie « aucune référence ».
Si vous utilisez une variable qui vaut null, Java lĂšve une
NullPointerException.
int a toujours une valeur.
Une variable objet, elle, peut valoir null.
1.2.5 â Autoboxing (int / Integer)
Chaque type primitif a une version objet : int devient Integer,
double devient Double, et ainsi de suite.
Java convertit automatiquement dans les deux sens.
On parle dâautoboxing (primitif â objet) et dâunboxing (objet â primitif).
Pourquoi est-ce utile ? Parce que les collections nâacceptent que des objets.
Vous écrivez donc List<Integer>, et non List<int>.
Integer n = 3; // autoboxing : int â Integer
int x = n; // unboxing : Integer â int
Integer vaut null et que vous le convertissez
en int, Java lĂšve une NullPointerException.
1.2.6 â String : immuabilitĂ©, == et equals
String est une classe. Une variable de type String est donc une référence.
De plus, les chaĂźnes sont immuables : vous ne modifiez pas une chaĂźne existante,
vous en créez une nouvelle.
Sur un primitif, == compare la valeur.
Sur un objet, == compare les rĂ©fĂ©rences : est-ce le mĂȘme objet en
mémoire ?
Pour comparer le contenu de deux chaĂźnes, vous utilisez equals.
int a = 5, b = 5;
System.out.println(a == b); // true : mĂȘme valeur
String u = "Java";
String v = "Java";
String w = new String("Java");
System.out.println(u == v); // souvent true (pool de littĂ©raux) â ne pas sây fier
System.out.println(u == w); // false : deux objets
System.out.println(u.equals(w)); // true : mĂȘme contenu
String s = null;
System.out.println("Java".equals(s)); // false, sans exception
// s.equals("Java"); // â NullPointerException
==.
Pour les objets (String, etc.), utilisez equals.
Si la variable peut ĂȘtre null, prĂ©fĂ©rez
"texte".equals(variable) : cela évite une exception.
1.2.7 â String vers un nombre
Quand lâutilisateur tape au clavier, ou quand vous passez un argument en ligne de commande,
vous rĂ©cupĂ©rez souvent un String â du texte, pas un nombre.
Or vous ne pouvez pas calculer directement avec du texte. Il faut dâabord le convertir. Java fournit pour cela des mĂ©thodes toutes faites :
int n = Integer.parseInt("42");
double p = Double.parseDouble("3.14");
long g = Long.parseLong("8000000000");
Comme vous pouvez le voir, parseInt donne un int,
parseDouble un double, et parseLong un long.
Integer.parseInt("abc"), Java lĂšve une
NumberFormatException (vous verrez les exceptions en détail au chapitre 5).
1.2.8 â enum : un type Ă valeurs fixes
Parfois, une valeur ne peut prendre que quelques possibilités bien définies :
par exemple roman, BD ou essai.
Un enum vous permet de nommer ces constantes.
Ce nâest pas un simple entier : câest un type Ă part entiĂšre.
Par convention, le nom de lâenum sâĂ©crit en PascalCase
(Genre, comme une classe), et chaque constante en
MAJUSCULES : ROMAN, BD, ESSAI.
enum Genre {
ROMAN, BD, ESSAI
}
Genre g = Genre.ROMAN;
switch (g) {
case ROMAN -> System.out.println("Récit");
case BD -> System.out.println("Bande dessinée");
case ESSAI -> System.out.println("Essai");
}
for (Genre x : Genre.values()) {
System.out.println(x);
}
values().
Les constructeurs et les méthodes sur un enum seront vus au chapitre 2.
1.2.9 â final, portĂ©e, valeurs par dĂ©faut
Le mot-clé final
Le mot-clĂ© final sâapplique Ă une variable pour dire :
« cette variable ne pourra recevoir quâune seule valeur ».
Une fois cette valeur fixée, vous ne pouvez plus la changer.
La façon la plus simple consiste à donner la valeur dÚs la déclaration.
Pour une constante nommée « une fois pour toutes », on écrit souvent le nom en
MAJUSCULES_AVEC_UNDERSCORES : MAX_LIVRES, TAUX_TVA.
final int MAX_LIVRES = 10;
// MAX_LIVRES = 11; // â interdit : la valeur est dĂ©jĂ fixĂ©e
Vous pouvez aussi dĂ©clarer une variable final sans lâinitialiser tout de suite.
Java accepte alors une premiĂšre affectation plus loin dans le code.
AprÚs cette premiÚre écriture, toute nouvelle affectation est refusée.
final int annee; // pas encore de valeur
if (choix == 1) {
annee = 2026; // premiÚre (et seule) affectation autorisée
} else {
annee = 2025; // premiĂšre affectation dans lâautre branche
}
// annee = 2030; // â interdit : annee a dĂ©jĂ reçu sa valeur
System.out.println(annee);
final reçoit bien une valeur
avant dâĂȘtre lue, et quâelle nâest Ă©crite quâune seule fois
sur chaque chemin possible du programme.
final :
vous fixez la valeur une fois â soit Ă la dĂ©claration, soit plus tard avec une premiĂšre affectation â
puis la variable devient constante.
PortĂ©e dâune variable locale
La portĂ©e dâune variable locale sâarrĂȘte Ă la fin du bloc { }
oĂč vous lâavez dĂ©clarĂ©e. En dehors de ce bloc, la variable nâexiste plus.
if (true) {
int x = 1; // x nâexiste que dans ce if
}
// System.out.println(x); // â erreur : x hors de portĂ©e
Valeurs par défaut
DerniĂšre distinction, essentielle. Un attribut de classe reçoit automatiquement une valeur par dĂ©faut. Une variable locale nâen a pas : le compilateur refuse de la lire tant que vous ne lâavez pas initialisĂ©e.
public class Demo {
int n; // 0
boolean ok; // false
double d; // 0.0
String s; // null
void m() {
int x; // pas de valeur par défaut
// System.out.println(x); // â le compilateur refuse
x = 1;
System.out.println(x);
}
}
0, false ou null).
1.3Ăcriture dâun programme
Maintenant que vous connaissez les types et les variables, il reste Ă calculer, Ă prendre des dĂ©cisions, Ă rĂ©pĂ©ter des actions et Ă lire ce que lâutilisateur tape. Câest ce que vous ferez dans presque tous vos programmes.
1.3.1 â OpĂ©rateurs
Les opĂ©rateurs sâappliquent aux variables vues en 1.2.2.
Deux piÚges reviennent souvent : la division entre entiers, et la différence entre
n++ et ++n.
| Famille | Opérateurs |
|---|---|
| Arithmétique | + - * / % |
| Comparaison | == != < > <= >= |
| Logique | && || ! |
| Affectation composée | += -= *= /= %= |
| Incrément / décrément | ++ -- |
int n = 5;
n += 2; // 7
n++; // 8 (post-incrément : utilise n puis ajoute 1)
++n; // 9 (pré-incrément : ajoute 1 puis utilise n)
int a = 3;
int b = a++; // b = 3, puis a = 4
int c = ++a; // a = 5, puis c = 5
Type du résultat
Quand vous mélangez des types dans une opération, Java ne « invente » pas un type au hasard. Le type du résultat correspond toujours au type le plus large parmi les opérandes.
Du plus étroit au plus large, retenez cette échelle :
byte < short < int < long < float < double < String
En pratique :
byteetintâ rĂ©sultat enintintetlongâ rĂ©sultat enlonglongetdoubleâ rĂ©sultat endouble- un nombre et un
Stringavec+â rĂ©sultat enString(concatĂ©nation)
byte b = 2;
int n = 10;
// byte r = b + n; // â le rĂ©sultat est un int, pas un byte
int r = b + n; // OK : 12
int i = 5;
long L = 2L;
long s = i + L; // OK : le résultat est un long
System.out.println(3 + " livres"); // "3 livres" : String
byte et short, Java passe souvent par
int avant de calculer. Câest pourquoi byte + byte donne aussi un
int.
LâopĂ©rateur ternaire remplace un if / else qui choisit une
valeur. Pratique, non ?
String statut = (annee >= 2000) ? "récent" : "ancien";
5 / 2 donne 2, car les deux opérandes
sont des entiers. Pour obtenir un résultat décimal, écrivez par exemple 5 / 2.0.
Exercice de réflexion
Avant de continuer, testez-vous. Sans exécuter le programme, essayez de trouver les valeurs finales.
Souvenez-vous : * a priorité sur + et -,
et ++a / --d se font avant dâutiliser la valeur,
alors que c-- utilise dâabord la valeur, puis dĂ©crĂ©mente.
Que valent x, a, b, c et d
aprĂšs ces instructions ?
int a = 1, b = 2, c = 3, d = 4;
int x = ++a - ++b * c-- + --d;
1.3.2 â Affichage : print, println et printf
Pour afficher du texte Ă lâĂ©cran, Java vous propose trois mĂ©thodes courantes sur
System.out.
System.out.println affiche un texte, puis passe Ă la ligne suivante.
System.out.print affiche sans passer Ă la ligne.
Câest utile pour une invite de saisie : le curseur reste juste Ă cĂŽtĂ© du message.
System.out.print("Titre : "); // curseur reste sur la mĂȘme ligne
System.out.println("Dune"); // affiche puis nouvelle ligne
System.out.println(2026); // accepte aussi les primitifs
System.out.println("Dune" + " (" + 1965 + ")"); // message composé
Et si vous voulez formater proprement un message avec des variables ?
Utilisez System.out.printf.
Vous écrivez un modÚle (une chaßne avec des emplacements), puis vous passez les valeurs à insérer.
String titre = "Dune";
int annee = 1965;
double prix = 12.5;
System.out.printf("Titre : %s%n", titre);
System.out.printf("Année : %d%n", annee);
System.out.printf("Prix : %.2f âŹ%n", prix);
System.out.printf("%s (%d) coĂ»te %.2f âŹ%n", titre, annee, prix);
System.out.println(titre + " (" + annee + ") coĂ»te " + prix + " âŹ");
| Emplacement | RĂŽle | Exemple |
|---|---|---|
%s |
Texte (String) |
%s â Dune |
%d |
Entier | %d â 1965 |
%f |
Nombre dĂ©cimal | %.2f â deux chiffres aprĂšs la virgule |
%n |
Retour à la ligne | équivalent portable de \n |
print et println affichent tel quel ;
printf assemble un texte formatĂ© Ă partir dâun modĂšle et de valeurs.
1.3.3 â if et switch
Quand vous devez tester une condition, vous utilisez un if.
Quand vous devez choisir parmi quelques cas précis (int, String ou
enum), un switch est souvent plus lisible.
if (annee >= 2000) {
System.out.println("XXIe siĂšcle");
} else if (annee >= 1900) {
System.out.println("XXe siĂšcle");
} else {
System.out.println("Avant 1900");
}
Avec un switch « classique », chaque case se termine en général par
break. Sans break, lâexĂ©cution continuerait dans le cas suivant
(câest le fall-through).
int choix = 2;
switch (choix) {
case 1:
System.out.println("Ajouter");
break;
case 2:
System.out.println("Lister");
break;
case 3:
System.out.println("Quitter");
break;
default:
System.out.println("Inconnu");
break;
}
Depuis Java récent, vous pouvez aussi écrire une forme plus courte avec des flÚches
->. Dans ce cas, vous nâavez pas besoin de break :
switch (choix) {
case 1 -> System.out.println("Ajouter");
case 2 -> System.out.println("Lister");
case 3 -> System.out.println("Quitter");
default -> System.out.println("Inconnu");
}
switch classique, nâoubliez pas
break aprĂšs chaque cas, sauf si vous voulez volontairement enchaĂźner plusieurs cas.
1.3.4 â for, while, do-while, break, continue
Si vous connaissez Ă lâavance le nombre de tours, utilisez un for.
Si le nombre de tours dĂ©pend dâune condition, utilisez un while :
le test se fait avant chaque tour.
Si vous devez exécuter le corps de la boucle au moins une fois,
utilisez un do-while : le test se fait aprĂšs le premier tour.
for (int i = 0; i < 3; i++) {
System.out.println(i);
}
int n = 3;
while (n > 0) { // 0, 1 ou plusieurs tours
System.out.println(n);
n--;
}
int x = 0;
do { // au moins un tour
System.out.println(x);
x++;
} while (x < 3);
for (int i = 0; i < 10; i++) {
if (i == 2) continue; // saute la suite de ce tour
if (i == 5) break; // sort de la boucle
System.out.println(i); // 0 1 3 4
}
continue saute la fin du tour en cours et passe au suivant.
break sort complĂštement de la boucle.
Vous verrez aussi le parcours dâun tableau avec for (⊠: âŠ) juste aprĂšs, en 1.3.5.
Exercice de réflexion
Maintenant que vous avez vu continue et break, testez votre lecture
dâun programme un peu plus riche. Sans lâexĂ©cuter, essayez de prĂ©voir exactement ce qui sâaffiche
Ă lâĂ©cran. Vous devez suivre Ă la fois la boucle, le test pair/impair et lâaccumulation de
total.
Que sâaffiche Ă la console aprĂšs lâexĂ©cution de ce programme ?
int total = 0;
for (int i = 1; i <= 8; i++) {
if (i % 2 == 0) {
continue;
}
total = total + i;
System.out.println("i=" + i + " total=" + total);
if (total >= 9) {
break;
}
}
System.out.println("fin total=" + total);
1.3.5 â Tableaux (1D et 2D)
Un tableau a une taille fixe, choisie au moment de sa création.
Les index commencent Ă 0.
La propriĂ©tĂ© length vous donne le nombre dâĂ©lĂ©ments.
Pour déclarer un tableau, vous avez deux écritures possibles.
La plus courante place les crochets [] juste aprĂšs le type, donc
avant le nom de la variable : int[] tab.
Java accepte aussi lâĂ©criture int tab[], avec les crochets aprĂšs le nom.
Les deux formes crĂ©ent le mĂȘme type de variable.
int[] notes = new int[3]; // forme recommandée : [] avant le nom
int notes2[] = new int[3]; // forme aussi acceptée : [] aprÚs le nom
notes[0] = 12;
notes[1] = 15;
notes[2] = 9;
String[] titres = {"Dune", "1984", "Névrose"};
for (int i = 0; i < titres.length; i++) {
System.out.println(i + " : " + titres[i]);
}
// Parcours sans index (foreach) : chaque élément du tableau, un par un
for (String t : titres) {
System.out.println(t);
}
int[][] grille = {
{1, 2, 3},
{4, 5, 6}
};
for (int i = 0; i < grille.length; i++) {
for (int j = 0; j < grille[i].length; j++) {
System.out.print(grille[i][j] + " ");
}
System.out.println();
}
// MĂȘme parcours avec foreach
for (int[] ligne : grille) {
for (int valeur : ligne) {
System.out.print(valeur + " ");
}
System.out.println();
}
int[] tab : le type se lit dâun seul bloc
(« un tableau dâentiers nommĂ© tab »).
Si vous ne connaissez pas la taille Ă lâavance, vous utiliserez les collections (chapitre 4).
Pour un tableau Ă deux dimensions, grille.length donne le nombre de lignes, et
grille[i].length donne la taille de la ligne i.
1.3.6 â Saisie console (Scanner)
Pour lire ce que lâutilisateur tape au clavier, Java fournit la classe Scanner,
branchée sur System.in.
Vous utilisez nextLine() pour lire du texte,
nextInt() pour un entier, et nextDouble() pour un nombre décimal.
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Titre : ");
String titre = in.nextLine();
System.out.print("Année : ");
int annee = in.nextInt();
in.nextLine(); // consomme le retour Ă la ligne restant
System.out.println(titre + " (" + annee + ")");
in.close();
}
}
nextInt(), le retour Ă la ligne (\n) reste dans le tampon.
Si vous appelez ensuite nextLine() sans le consommer, vous lisez une ligne vide.
Exemple filé
Mettons tout cela bout à bout : un petit catalogue de titres, lus au clavier puis affichés.
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] titres = new String[3];
for (int i = 0; i < titres.length; i++) {
System.out.print("Titre " + (i + 1) + " : ");
titres[i] = in.nextLine();
}
System.out.println("--- Catalogue ---");
for (String t : titres) {
System.out.println("- " + t);
}
in.close();
}
}
Exercice de réflexion
Exercice â CrĂ©ation et remplissage dâun tableau
Ăcrire un programme qui demande Ă lâutilisateur de saisir la taille dâun tableau.
La taille saisie doit ĂȘtre un entier strictement positif (n > 0).
Tant que lâutilisateur saisit une valeur invalide, le programme doit lui redemander
la taille.
Une fois une taille valide obtenue, crĂ©er le tableau, puis demander Ă lâutilisateur de saisir les valeurs qui permettront de le remplir.
Contraintes :
- utiliser une boucle
do...whilepour contrÎler la saisie de la taille ; - créer le tableau uniquement aprÚs avoir obtenu une taille valide ;
- parcourir ensuite le tableau pour demander et stocker ses valeurs.
1.3.7 â Arguments de la ligne de commande
Vous vous souvenez de String[] args dans la méthode main ?
Câest un tableau de String : le mĂȘme type que
String[] titres vu en 1.3.5.
La JVM remplit args avec ce que vous écrivez aprÚs le nom de la classe
au lancement. Chaque mot séparé par un espace devient un élément du tableau.
Par exemple, si vous lancez :
java App Dune 1965
alors :
args.lengthvaut2;args[0]vaut"Dune";args[1]vaut"1965"(toujours du texte, mĂȘme si ça ressemble Ă un nombre).
public class App {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("Aucun argument");
return;
}
for (String a : args) {
System.out.println(a);
}
int n = Integer.parseInt(args[0]);
System.out.println(n * 2);
}
}
java App Dune 1965
java App 21
args est un String.
Pour calculer avec un nombre passĂ© en argument, convertissez-le dâabord avec
Integer.parseInt (voir 1.2.7).
1.3.8 â Commentaires et Javadoc
Java propose trois formes de commentaires. Les deux premiĂšres servent Ă expliquer le code pour vous-mĂȘme. La troisiĂšme, appelĂ©e Javadoc, documente une mĂ©thode pour les personnes qui liront le code plus tard â y compris vous dans six mois.
// commentaire de ligne
/*
* commentaire
* sur plusieurs lignes
*/
/**
* Affiche le titre dâun livre.
* @param titre le titre Ă afficher
*/
public static void afficher(String titre) {
System.out.println(titre);
}
En résumé
- Vous compilez vers du bytecode ; la JVM lâexĂ©cute sur chaque systĂšme.
- Une classe
publicporte le mĂȘme nom que son fichier ;mainest le point dâentrĂ©e. - Un primitif contient une valeur. Un objet est atteint par une rĂ©fĂ©rence, qui peut valoir
null. Pour les chaĂźnes, comparez avecequals, pas avec==. - Un programme typique combine variables,
ifou boucles, tableaux etScanner.