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?
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:
main()
utilisant les paramètres de ligne de commande sont applicables.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 .
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
.