Tout le code Java s'exécute dans le contexte d'un thread . Le JavaDoc lié explique le traitement des erreurs et les critères de sortie, mais voici l'essentiel:
- La JVM se tourne et prépare l'environnement d'exécution.
- La JVM crée un thread qui exécutera la
main()
méthode en utilisant les paramètres de ligne de commande applicables.
- La JVM définit un gestionnaire d'exceptions non capturé par défaut qui imprime l'exception à l'erreur standard et se termine.
- La JVM exécute le thread.
Dans le cas d'une exception non capturée, le programme meurt effectivement selon le troisième élément ci-dessus. Ce comportement est spécifié dans la spécification du langage Java, section 11.3
information additionnelle
D'autres ont mentionné des blocs statiques et comment ils s'exécutent auparavant main()
. Cependant, cela nécessite un peu plus d'explications pour bien comprendre.
Lors du chargement d'une classe, le chargeur de classe doit initialiser tous les static final
états et exécuter tous les static
blocs avant que la classe puisse être utilisée, pour inclure des instances instanciantes de la classe (à part: créer une classe Java où une constante de classe est initialisée dans un bloc statique après avoir créé un instance de la classe et le constructeur référence la constante. Boom!). Cependant, tout cela se produit dans la logique du chargeur de classe avant qu'un code puisse référencer la classe . De plus, la classe est chargée dans le thread référencé par la classe.
Cela signifie que si la classe contenant fait main()
référence à une autre classe (par exemple une constante de classe), cette classe doit être chargée avant d'être main()
exécutée pour inclure ses blocs statiques. Sinon, les blocs statiques sont exécutés comme ci-dessus. Si la classe ne parvient pas à charger, alors la classe contenant main()
échouera également à charger et le programme se terminera.
Autre info: les blocs statiques peuvent se lancer. Errors
sont jetés tels quels. Exceptions
sont interdits (erreur de compilation). RuntimeExceptions
sont enveloppés dans ExceptionInInitializerError . Celles-ci sont gérées par le gestionnaire d'exceptions non capturé, qui généralement tuera le thread ou l'application (thread principal) sauf si vous encapsulez soigneusement la référence de classe (et le chargement) dans un try
- catch
.