Tutto il codice Java viene eseguito nel contesto di un thread . Il JavaDoc collegato spiega i criteri di gestione degli errori e di uscita, ma ecco il succo:
- La JVM si gira e prepara l'ambiente di esecuzione.
- La JVM crea un thread che eseguirà il metodo
main()
utilizzando qualsiasi parametro della riga di comando applicabile.
- La JVM imposta un gestore di eccezioni non interrogato di default che stampa l'eccezione all'errore standard e termina.
- La JVM esegue il thread.
Nel caso di un'eccezione non rilevata, il programma muore efficacemente per il terzo elemento sopra. Questo comportamento è ulteriormente specificato nella Specifica del linguaggio Java, Sezione 11.3
Informazioni aggiuntive
Altri hanno menzionato blocchi statici e come vengono eseguiti prima di main()
. Tuttavia, questo richiede un po 'più di spiegazione per capire correttamente.
Quando si carica una classe, il programma di caricamento classi deve inizializzare tutto lo stato static final
ed eseguire tutti i blocchi static
prima la classe può essere utilizzata, per includere istanze di istanza della classe (a parte: creare una classe Java in cui una costante di classe viene inizializzata in un blocco statico dopo creando un'istanza della classe e il costruttore fa riferimento alla costante Boom!). Tuttavia, tutto ciò avviene nella logica del programma di caricamento prima che qualsiasi codice possa fare riferimento alla classe . Inoltre, la classe viene caricata in qualsiasi thread a cui si fa riferimento nella classe.
Ciò significa che se la classe contenente main()
fa riferimento a un'altra classe (ad esempio costante di classe), allora quella classe deve essere caricata prima che main()
venga eseguita per includere i blocchi statici. Altrimenti, i blocchi statici sono eseguiti come sopra. Se la classe non riesce a caricare, anche la classe contenente main()
non verrà caricata e il programma verrà terminato.
Un'altra FYI: i blocchi statici possono lanciare. Errors
viene lanciato così com'è. Exceptions
è vietato (errore in fase di compilazione). RuntimeExceptions
sono racchiusi in ExceptionInInitializerError . Questi vengono gestiti per il gestore di eccezioni non rilevate, che in genere uccide il thread o l'applicazione (thread principale) a meno che non si avvolga accuratamente il riferimento di classe (e il caricamento) in try
- catch
.