Todo o código Java é executado no contexto de um encadeamento . O JavaDoc vinculado explica o tratamento de erros e os critérios de saída, mas aqui está a essência:
- A JVM se gira e prepara o ambiente de execução.
- A JVM cria um encadeamento que executará o
main()método usando quaisquer parâmetros da linha de comandos aplicáveis.
- A JVM configura um manipulador de exceção não capturado padrão que imprime a exceção em erro padrão e termina.
- A JVM executa o encadeamento.
No caso de uma exceção não capturada, o programa morre efetivamente pelo terceiro item acima. Esse comportamento é especificado posteriormente na Especificação de Linguagem Java, Seção 11.3
informação adicional
Outros mencionaram blocos estáticos e como eles são executados antes main(). No entanto, isso requer um pouco mais de explicação para entender corretamente.
Ao carregar uma classe, o carregador de classes deve inicializar todos os static finalestados e executar todos os staticblocos antes que a classe possa ser usada, para incluir instâncias da classe (além disso: crie uma classe Java em que uma constante de classe seja inicializada em um bloco estático após a criação de um instância da classe e o construtor referencia a constante. Boom!). No entanto, tudo isso acontece na lógica do carregador de classes antes que qualquer código possa fazer referência à classe . Além disso, a classe é carregada em qualquer thread que faça referência à classe.
O que isso significa é que, se a classe que contém main()referências a outra classe (por exemplo, constante da classe), essa classe deve ser carregada antes da main()execução para incluir seus blocos estáticos. Caso contrário, os blocos estáticos são executados como acima. Se a classe falhar ao carregar, a classe que contém main()também falhará ao carregar e o programa será encerrado.
Outro FYI: blocos estáticos podem ser lançados. Errorssão jogados como estão. Exceptionssão proibidos (erro em tempo de compilação). RuntimeExceptionssão agrupados em ExceptionInInitializerError . Eles são manipulados pelo manipulador de exceção não capturado, que normalmente mata o thread ou o aplicativo (thread principal), a menos que você agrupe cuidadosamente a referência de classe (e o carregamento) em um try- catch.