Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

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 Exceptions ou les Errors, 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

1. Le mardi 7 octobre 2008, 10:35 par Bh@Mp0

public class Quiz17 {

  static {
     System.out.println("Hello World!");
     System.exit(0);
  }

}

Le "exit(0)" ne sert qu'à ne pas avoir d'erreur à l'exécution (du fait de la recherche de la méthode "main").

2. Le mardi 7 octobre 2008, 12:29 par Olivier Croisier

C'est la bonne réponse, mais ce serait sympa de laisser un peu chercher les autres pour les prochains quiz ^^;

3. Le mardi 7 octobre 2008, 15:07 par Bh@Mp0

Arf désolé ... en même temps, ceux qui ne veulent pas lire peuvent juste regarder l'intitulé du quiz :)

4. Le mardi 7 octobre 2008, 15:08 par Bh@Mp0

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 ?

5. Le jeudi 7 novembre 2013, 13:42 par Fabinout

Bonjour Olivier, il serait bon de noter que cette technique ne fonctionne plus depuis Java 7.
Fab

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.