oct.
2008
Java Quiz #17
Comment écrire un programme Java sans méthode main
, qui affiche (sans aucune erreur) «Hello world!
» lorsqu'on l'exécute ?
Réponse : avec un bloc d'initialisation statique.
En effet, ce bloc de code est toujours exécuté lorsque la classe est chargée. Donc, avant que ne soit exécuté le code de la méthode main
. Ainsi, exécuter :
public class HelloWorldSansMain { static { System.out.println("Hello World!"); } }
compile correctement, et affiche lorsqu'on l'exécute :
Hello World! Exception in thread "main" java.lang.NoSuchMethodError: main
Donc, le code du bloc d'initialisation statique est bien exécuté avant que la méthode main
ne soit recherchée par la JVM. Mais comment éviter l'exception NoSuchMethodError
?
Réponse : en interrompant l'exécution du programme avant que la recherche de la méthode main
n'ait pu être faite. Par exemple, avec un System.exit
. Ainsi, lorsqu'on exécute la classe suivante :
public class HelloWorldSansMain { static { System.out.println("Hello World!"); System.exit(0); // Evite l'exception java.lang.NoSuchMethodError: main } }
elle affiche bien, sans lever d'erreur :
Hello World!
Amusant, non ?
Edit novembre 2013 :
Comme l'indique Fab (merci !), depuis Java 7, le contrôle sur l'existence du main
au démarrage de la JVM a changé, et du coup, la classe sans méthode main
s'exécute avec une erreur :
Erreur : la méthode principale est introuvable dans la classe HelloWorldSansMain, définissez la méthode principale comme suit : public static void main(String[] args)
Vous noterez d'ailleurs qu'il ne s'agit pas d'une exception Java classique, car le message est exprimé dans la langue du système, ce qu n'est traditionnellement pas le cas des messages qui accompagnent les Exception
s ou les Error
s, qui sont eux en anglais !
On peut éliminer le problème en ajoutant un main
vide à la classe HelloWorldSansMain
(et dans ce cas, le System.exit(0);
devient inutile). Mais le moins que l'on puisse dire, c'est que cela fait alors perdre tout intérêt au quiz !
Commentaires
public class Quiz17 {
}
Le "exit(0)" ne sert qu'à ne pas avoir d'erreur à l'exécution (du fait de la recherche de la méthode "main").
C'est la bonne réponse, mais ce serait sympa de laisser un peu chercher les autres pour les prochains quiz ^^;
Arf désolé ... en même temps, ceux qui ne veulent pas lire peuvent juste regarder l'intitulé du quiz :)
PS : je crois qu'il y a un mod sur dotclear permettant de cacher les commentaires jusqu'à une certaine date ... ça pourrait être pas mal, non ?
Bonjour Olivier, il serait bon de noter que cette technique ne fonctionne plus depuis Java 7.
Fab