web-dev-qa-db-fra.com

Comment le JVM gère-t-il une exception projetée par la méthode principale?

Je comprends des exceptions, les jetant, les manipulant et les propage à une méthode plus basse dans la pile d'appels (c'est-à-dire throws).

Ce que je ne comprends pas, c'est ceci:

public static void main(String[] args) throws Exception {
    ...
}

Maintenant, je supposons que dans le cas où main jette un Exception, la JVM le gère (correct?). Si c'est le cas, ma question est la suivante:

Comment la jvm gère-t-elle des exceptions projetées par main? Qu'est ce que ça fait?

10
Aviv Cohn

All Java est exécuté dans le contexte d'un thread . Le Javadoc lié explique les critères de traitement des erreurs et de sortie, mais voici le gist de celui-ci:

  • La JVM se chevauche et prépare l'environnement d'exécution.
  • Le JVM crée un fil qui exécutera la méthode main() utilisant les paramètres de ligne de commande sont applicables.
  • Le JVM définit un gestionnaire d'exception non capturé par défaut qui imprime l'exception à l'erreur standard et se termine.
  • Le JVM exécute le fil.

Dans le cas d'une exception non capturée, le programme meurt effectivement par troisième élément ci-dessus. Ce comportement est en outre spécifié dans la spécification de langue Java , section 11.3 .


Information additionnelle

D'autres ont mentionné des blocs statiques et leur exécution avant main(). Cependant, cela nécessite un peu plus d'explications pour comprendre correctement.

Lors du chargement d'une classe, le chargeur de classe doit initialiser tout static final état et exécuter tous les blocs static avant La classe peut être utilisée pour inclure des instances instantanées de la classe ( de côté: créer un Java classe où une constante de classe est initialisée dans un bloc statique après Création d'une instance de la classe, et le constructeur référence le constante. Boom!). Cependant, tout cela se passe dans la logique de la classe Loader avant que tout code ne puisse référence à la classe . En outre, la classe est chargée dans le fil de la classe.

Ce que cela signifie que si la classe contenant main() fait référence à une autre classe (par exemple, constante de classe), alors cette classe doit être chargée avant main() exécute inclure ses blocs statiques. Sinon, les blocs statiques sont exécutés comme ci-dessus. Si la classe ne parvient pas à charger, la classe contenant main() ne parviendra pas à charger et le programme prendra fin.

Un autre fyi: blocs statiques can lancer. Errors est lancé comme-est. Exceptions sont interdits (erreur de compilation). RuntimeExceptions est enveloppé dans ExceptionInitializImizerError . Celles-ci sont manipulées par le gestionnaire d'exceptions non capturées, qui vont généralement tuer le fil ou l'application (fil principal) à moins que vous n'enveloppiez délicatement la référence de la classe (et le chargement) dans un try - catch.

9
user22815