Un programme Java commence son exécution avec sa méthode main(). Dans cette section, vous apprendrez comment en créer une, passer un paramètre et exécuter un programme. La méthode main() est souvent appelée un point d’entrée dans le programme, car c’est le point de départ que la JVM recherche lorsqu’elle commence à exécuter un nouveau programme.
Comment Créer une Méthode main() en Java
La méthode main() permet à la JVM d’appeler notre code. La classe la plus simple possible avec une méthode main() ressemble à ceci :
public class Zoo {
public static void main(String[] args) {
System.out.println("Bonjour le monde");
}
}
Ce code affiche Bonjour le monde. Pour compiler et exécuter ce code, tapez-le dans un fichier appelé Zoo.java et exécutez les commandes suivantes :
javac Zoo.java
java Zoo
Pour compiler du code Java avec la commande javac, le fichier doit avoir l’extension .java. Le nom du fichier doit correspondre au nom de la classe publique. Le résultat est un fichier de bytecode portant le même nom mais avec l’extension .class. Rappelez-vous que le bytecode consiste en des instructions que la JVM sait exécuter. Notez que nous devons omettre l’extension .class pour exécuter Zoo.class.
Les règles concernant le contenu d’un fichier Java et son ordre sont les suivantes :
- Chaque fichier ne peut contenir qu’une seule classe publique.
- Le nom du fichier doit correspondre au nom de la classe, y compris la casse, et avoir une extension .java
- Si la classe Java est un point d’entrée pour le programme, elle doit contenir une méthode main() valide.
Modificateurs Obligatoires pour la Méthode main() en Java
Examinons d’abord les mots dans la signature de la méthode main(), un par un. Le mot-clé public est ce qu’on appelle un modificateur d’accès. Il déclare le niveau d’exposition de cette méthode aux appelants potentiels dans le programme. Naturellement, public signifie un accès complet depuis n’importe où dans le programme.
Le mot-clé static lie une méthode à sa classe pour qu’elle puisse être appelée uniquement par le nom de la classe, comme par exemple Zoo.main(). Java n’a pas besoin de créer un objet pour appeler la méthode main() ! En fait, la JVM fait cela, plus ou moins, lors du chargement du nom de classe qui lui est donné.
Le mot-clé void représente le type de retour. Une méthode qui ne renvoie aucune donnée retourne silencieusement le contrôle à l’appelant. En général, il est conseillé d’utiliser void pour les méthodes qui modifient l’état d’un objet. Dans ce sens, la méthode main() fait passer l’état du programme de démarré à terminé.
Enfin, nous arrivons à la liste des paramètres de la méthode main(), représentée comme un tableau d’objets java.lang.Chaine. Vous pouvez utiliser n’importe quel nom de variable valide avec l’un de ces trois formats :
String[] args
String options[]
String... amis
Le compilateur accepte n’importe lequel de ces formats. Le nom de variable args est courant car il suggère que cette liste contient des valeurs qui ont été lues (arguments) lorsque la JVM a démarré. Les caractères [] sont des crochets et représentent un tableau. Un tableau est une liste de taille fixe d’éléments qui sont tous du même type. Les caractères … sont appelés varargs (listes d’arguments variables).
Modificateurs optionnels dans les méthodes main()
Bien que la plupart des modificateurs, comme public et static, soient requis pour les méthodes main(), certains modificateurs optionnels sont autorisés.
public final static void main(final String[] args) {}
Dans cet exemple, les deux modificateurs final sont optionnels, et la méthode main() est un point d’entrée valide avec ou sans eux.
Comment Passer des Paramètres à un Programme Java
Voyons comment envoyer des données à la méthode main() de notre programme. D’abord, nous modifions le programme Zoo pour afficher les deux premiers arguments passés :
public class Zoo {
public static void main(String[] args) {
System.out.println(args[0]);
System.out.println(args[1]);
}
}
Le code args[0] accède au premier élément du tableau. En effet, les index de tableau commencent à 0 en Java. Pour l’exécuter, tapez ceci :
javac Zoo.java
java Zoo Bronx Zoo
La sortie est ce à quoi vous pourriez vous attendre :
Bronx
Zoo
Le programme identifie correctement les deux premiers “mots” comme arguments. Les espaces sont utilisés pour séparer les arguments. Si vous voulez des espaces à l’intérieur d’un argument, vous devez utiliser des guillemets comme dans cet exemple :
javac Zoo.java
java Zoo "San Diego" Zoo
Maintenant nous avons un espace dans la sortie :
San Diego
Zoo
Enfin, que se passe-t-il si vous ne passez pas assez d’arguments ?
javac Zoo.java
java Zoo Zoo
La lecture de args[0] se passe bien, et Zoo est affiché. Puis Java panique. Il n’y a pas de deuxième argument ! Que faire ? Java affiche une exception vous indiquant qu’il ne sait pas quoi faire avec cet argument à la position 1.
Zoo
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
Index 1 out of bounds for length 1
at Zoo.main(Zoo.java:4)
Pour résumer, le JDK contient un compilateur. Les fichiers de classe Java s’exécutent sur la JVM et donc s’exécutent sur n’importe quelle machine avec Java plutôt que uniquement sur la machine ou le système d’exploitation sur lequel ils ont été compilés.
Code source à fichier unique
Si vous en avez assez de taper à la fois javac et java chaque fois que vous voulez essayer un exemple de code, il existe un raccourci. Vous pouvez à la place exécuter :
java Zoo.java Bronx Zoo
Il y a une différence clé ici. Lors de la compilation préalable, vous omettiez l’extension .java lors de l’exécution de java. Lorsque vous sautez l’étape de compilation explicite, vous incluez cette extension. Cette fonctionnalité s’appelle le lancement de programmes à code source à fichier unique et est utile pour les tests ou les petits programmes. Le nom indique astucieusement qu’elle est conçue pour quand votre programme tient en un seul fichier.
Quizz
Parmi les méthodes point d’entrée suivantes, lesquelles sont valides et peuvent être exécutées depuis la ligne de commande ? (Choisissez toutes les réponses qui s’appliquent.)
A. private static void main(String[] args)
B. public static final main(String[] args)
C. public void main(String[] args)
D. public static final void main(String[] args)
E. public static void main(String[] args)
F. public static main(String[] args)
Voir les réponses
Réponses D, E.
La méthode main() doit respecter une signature précise pour être reconnue comme point d’entrée valide par la JVM :
public static void main(String[] args) // Signature canonique (E
Cette signature constitue la forme standard recommandée. La variante avec le modificateur final
(D) est également valide :
public static final void main(String[] args) // Variante acceptée
Les autres signatures sont invalides pour les raisons suivantes :
- Le modificateur d’accès
private
(A) empêche la JVM d’accéder à la méthode - L’absence de type de retour
void
(B et F) rend la méthode non conforme - L’absence du modificateur
static
(C) nécessiterait une instanciation de classe
Points essentiels à retenir :
- La méthode doit être
public
pour l’accessibilité - Le modificateur
static
est requis pour l’exécution sans instance - Le type de retour
void
est obligatoire - Les paramètres doivent être un tableau de
String
La signature canonique (E) reste la forme recommandée, même si la version avec final
(D) est techniquement correcte.