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 final
estados e executar todos os static
blocos 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. Errors
são jogados como estão. Exceptions
são proibidos (erro em tempo de compilação). RuntimeExceptions
sã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
.