System.exit()
pode ser usado para executar ganchos de desligamento antes do encerramento do programa. Essa é uma maneira conveniente de lidar com o desligamento em programas maiores, onde todas as partes do programa não podem (e não deveriam) estar cientes uma da outra. Então, se alguém quiser sair, ele pode simplesmente ligarSystem.exit()
e os ganchos de desligamento (se configurados corretamente) cuidam de realizar todas as cerimônias de desligamento necessárias, como fechar arquivos, liberar recursos etc.
"Este método nunca retorna normalmente." significa apenas que o método não retornará; uma vez que um thread chegue lá, ele não voltará.
Outra maneira, talvez mais comum, de sair de um programa é simplesmente chegar ao final do main
método. Porém, se houver algum encadeamento que não seja daemon em execução, eles não serão encerrados e, portanto, a JVM não sairá. Portanto, se você tiver algum desses threads não daemon, precisará de outros meios (além dos ganchos de encerramento) para desligar todos os threads não daemon e liberar outros recursos. Se não houver outros encadeamentos que não sejam daemon, retornar de main
encerrará a JVM e chamará os ganchos de encerramento.
Por alguma razão, os ganchos de desligamento parecem ser um mecanismo subvalorizado e incompreendido, e as pessoas estão reinventando a roda com todos os tipos de hacks personalizados proprietários para encerrar seus programas. Eu recomendaria o uso de ganchos de desligamento; está tudo no Runtime padrão que você usará de qualquer maneira.
Runtime.getRuntime().halt()
)Nesse caso, não é necessário. Nenhum encadeamento extra será iniciado, você não está alterando o código de saída (o padrão é 0) - basicamente é inútil.
Quando os documentos dizem que o método nunca retorna normalmente, significa que a linha de código subsequente é efetivamente inacessível, mesmo que o compilador não saiba que:
Uma exceção será lançada ou a VM será encerrada antes de retornar. Nunca "apenas retornará".
É muito raro valer a pena chamar
System.exit()
IME. Pode fazer sentido se você estiver escrevendo uma ferramenta de linha de comando e desejar indicar um erro através do código de saída, em vez de apenas lançar uma exceção ... mas não me lembro da última vez em que o usei no código de produção normal .fonte
System.exit()
nunca será concluído normalmente - sempre será concluído com uma exceção ou com o encerramento da VM (que não é realmente coberto pelo JLS).O método nunca retorna porque é o fim do mundo e nenhum do seu código será executado em seguida.
Seu aplicativo, no seu exemplo, sairia de qualquer maneira no mesmo local no código, mas, se você usar System.exit. você tem a opção de retornar um código personalizado para o ambiente, como, por exemplo,
Quem fará uso do seu código de saída? Um script que chamou o aplicativo. Funciona em Windows, Unix e todos os outros ambientes com scripts.
Por que retornar um código? Para dizer coisas como "não obtive sucesso", "o banco de dados não respondeu".
Para ver como obter o valor de um código de saída e usá-lo em um script shell unix ou script cmd do windows, verifique esta resposta neste site
fonte
System.exit(0)
finaliza a JVM. Em exemplos simples como este, é difícil perceber a diferença. O parâmetro é passado de volta ao sistema operacional e é normalmente usado para indicar finalização anormal (por exemplo, algum tipo de erro fatal); portanto, se você chamar java a partir de um arquivo em lotes ou script de shell, poderá obter esse valor e ter uma ideia se o aplicativo foi bem-sucedido.Isso causaria um grande impacto se você chamasse
System.exit(0)
um aplicativo implantado em um servidor de aplicativos (pense nisso antes de tentar).fonte
Em aplicativos que podem ter ganchos de desligamento complexos, esse método não deve ser chamado de um thread desconhecido.
System.exit
nunca sai normalmente porque a chamada será bloqueada até que a JVM seja encerrada. É como se qualquer código em execução tivesse o plugue de força pressionado antes de terminar. A chamadaSystem.exit
iniciará os ganchos de desligamento do programa e qualquer segmento que as chamadasSystem.exit
bloquearão até o encerramento do programa. Isso implica que, se o gancho de encerramento, por sua vez, enviar uma tarefa para o encadeamento do qualSystem.exit
foi chamado, o programa entrará em conflito.Estou lidando com isso no meu código com o seguinte:
fonte
Embora a resposta tenha sido realmente útil, mas de alguma forma faltou mais alguns detalhes extras. Espero que abaixo ajude a entender o processo de desligamento em java, além da resposta acima:
PS: A JVM pode desligar de forma ordenada ou abrupta .
fonte
NUNCA se deve chamar
System.exit(0)
por estas razões:Sair do programa "normalmente" fornece o mesmo código de saída para o sistema operacional,
System.exit(0)
por isso é redundante.Se o seu programa não pode sair "normalmente", você perdeu o controle do seu desenvolvimento [design]. Você sempre deve ter controle total do estado do sistema.
A propósito: Retornar outros códigos de retorno diferentes de 0 faz sentido se você deseja indicar o encerramento anormal do programa.
fonte
System.exit é necessário
No seu caso, faz exatamente a mesma coisa que o simples retorno do main.
fonte
exit
é a sua única opção.exit
. Não é a única opção, mas definitivamente uma opção que vale a pena considerar.A especificação da linguagem Java diz que
Isso significa que você deve usá-lo quando tiver um programa grande (bem, pelo menos maior que este) e quiser concluir sua execução.
fonte
Se você tiver outro programa em execução na JVM e usar o System.exit, esse segundo programa também será fechado. Imagine, por exemplo, que você execute uma tarefa java em um nó do cluster e que o programa java que gerencia o nó do cluster seja executado na mesma JVM. Se o trabalho usasse System.exit, ele não apenas sairia do trabalho, mas também "desligaria o nó completo". Você não poderá enviar outro trabalho para esse nó do cluster, pois o programa de gerenciamento foi fechado acidentalmente.
Portanto, não use System.exit se desejar controlar seu programa de outro programa java na mesma JVM.
Use System.exit se desejar fechar a JVM completa de propósito e se desejar tirar proveito das possibilidades descritas nas outras respostas (por exemplo, ganchos de desligamento: gancho de desligamento de Java , valor de retorno diferente de zero para a linha de comandos chama: Como obter o status de saída de um programa Java no arquivo em lotes do Windows ).
Também dê uma olhada em Exceções de tempo de execução: System.exit (num) ou ative uma RuntimeException de main?
fonte