Todo el código Java se ejecuta en el contexto de un hilo . El JavaDoc vinculado explica el manejo de errores y los criterios de salida, pero aquí está lo esencial:
- La JVM gira y prepara el entorno de ejecución.
- La JVM crea un subproceso que ejecutará el
main()
método utilizando los parámetros de línea de comandos que sean aplicables.
- La JVM establece un controlador de excepciones no capturado predeterminado que imprime la excepción al error estándar y finaliza.
- La JVM ejecuta el hilo.
En el caso de una excepción no detectada, el programa efectivamente muere por el tercer elemento anterior. Este comportamiento se especifica con más detalle en la Especificación del lenguaje Java, Sección 11.3
información adicional
Otros han mencionado bloques estáticos y cómo se ejecutan antes main()
. Sin embargo, esto requiere un poco más de explicación para entenderlo correctamente.
Al cargar una clase, el cargador de clases debe inicializar todos los static final
estados y ejecutar todos los static
bloques antes de que la clase pueda usarse, para incluir instancias de instancia de la clase (aparte: cree una clase Java donde se inicializa una constante de clase en un bloque estático después de crear un instancia de la clase, y el constructor hace referencia a la constante. ¡Boom!). Sin embargo, todo esto sucede en la lógica del cargador de clases antes de que cualquier código pueda hacer referencia a la clase . Además, la clase se carga en cualquier hilo que haga referencia a la clase.
Esto significa que si la clase que contiene hace main()
referencia a otra clase (por ejemplo, constante de clase), esa clase debe cargarse antes de main()
ejecutarse para incluir sus bloques estáticos. De lo contrario, los bloques estáticos se ejecutan como anteriormente. Si la clase no se carga, entonces la clase que contiene main()
tampoco se cargará y el programa finalizará.
Otro FYI: pueden lanzar bloques estáticos . Errors
son arrojados como están. Exceptions
están prohibidos (error en tiempo de compilación). RuntimeExceptions
están envueltos en ExceptionInInitializerError . Estos se manejan según el controlador de excepción no capturado, que normalmente eliminará el subproceso o la aplicación (subproceso principal) a menos que ajuste cuidadosamente la referencia de clase (y la carga) en un try
- catch
.