Pergunta

Por vários motivos ligando System.exit é desaprovado ao escrever Aplicativos Java, então como posso notificar o processo de chamada de que nem tudo está indo conforme o planejado?

Editar: O 1 é um standin para qualquer código de saída diferente de zero.

Foi útil?

Solução

O uso de System.exit é desaprovado quando o 'aplicativo' é realmente um subaplicativo (por exemplo,servlet, applet) de uma aplicação Java maior (servidor):neste caso o System.exit poderia parar a JVM e, portanto, também todos os outros subaplicativos.Nessa situação, lançar uma exceção apropriada, que possa ser capturada e tratada pela estrutura/servidor do aplicativo, é a melhor opção.

Se o aplicativo Java realmente for executado como um aplicativo independente, não há nada de errado em usar System.exit.neste caso, definir um valor de saída é provavelmente a maneira mais fácil (e também a mais usada) de comunicar falha ou sucesso ao processo pai.

Outras dicas

Eu concordo com o "lançar uma exceção" multidão.Um motivo é que chamar System.exit dificulta o uso do seu código se você quiser que outro código possa usá-lo.Por exemplo, se você descobrir que sua classe seria útil em um aplicativo da web ou em algum tipo de aplicativo que consome mensagens, seria bom permitir que esses contêineres tivessem a oportunidade de lidar com a falha de alguma forma.Um contêiner pode querer tentar novamente a operação, decidir registrar e ignorar o problema, enviar um email para um administrador, etc.

Uma exceção a isso seria o seu main() método;isso poderia interceptar a exceção e chamar System.exit() com algum valor que pode ser reconhecido pelo processo de chamada ou script de shell.

System.exit() bloqueará e criará um conflito se o thread que o iniciou for usado em um gancho de desligamento.

Também pode ser perigoso/problemático em ambientes de servlet da web.

Lançar uma exceção é geralmente considerado a outra alternativa.

A política da nossa empresa é que não há problema (até mesmo é preferível) chamar System.exit(-1), mas apenas nos métodos init().Definitivamente, eu pensaria duas vezes antes de chamá-lo durante o fluxo normal de um programa.

Lançar exceções é a melhor maneira de enviar informações sobre um determinado erro para cima e para fora do aplicativo.

Um número não diz tanto quanto:

Exception at thread 'main': FileNotFoundException "The file 'foo' doesn't exist"

(Ou alguma coisa parecida)

É desaprovado por normal saídas.Se "nem tudo está indo conforme o planejado", então System.exit está bem.

Atualizar:Devo acrescentar que presumo que seu '1' tenha um significado documentado em algum lugar.

Acho que lançar uma exceção é o que você deve fazer quando algo dá errado.Dessa forma, se seu aplicativo não estiver sendo executado como um aplicativo independente, o chamador poderá reagir a ele e obter algumas informações sobre o que deu errado.Também é mais fácil para fins de depuração porque você também terá uma ideia melhor sobre o que deu errado ao ver um rastreamento de pilha.

Uma coisa importante a ser observada é que quando a exceção atinge o nível superior e, portanto, faz com que a VM saia, a VM retorna um código de retorno 1, portanto, aplicativos externos que usam o código de retorno veem que algo deu errado.

O único caso em que acho que System.exit() faz sentido é quando seu aplicativo deve ser chamado por aplicativos que não são Java e, portanto, precisa usar códigos de retorno para ver se seu aplicativo funcionou ou não e você deseja que esses aplicativos tenham uma chance de reagir de maneira diferente em diferentes coisas que dão errado, ou seja,você precisa de códigos de retorno diferentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top