2008-08-28 24 views
17

Por diversas razones que llaman System.exit es mal visto al escribir aplicaciones Java , así que ¿cómo puedo notificar al proceso de llamada que no todo va de acuerdo al plan?Alternativas a System.exit (1)

Editar: El 1 es un standin para cualquier código de salida distinto de cero.

Respuesta

23

El uso de System.exit está mal visto cuando la 'aplicación' es en realidad una sub-aplicación (por ejemplo, servlet, applet) de una aplicación más grande Java (servidor): en este caso el System.exit pudo detener la JVM y por lo tanto también todos otras sub-aplicaciones. En esta situación, arrojar una excepción apropiada, que podría ser capturada y manejada por el marco/servidor de aplicaciones es la mejor opción.

Si la aplicación java realmente se debe ejecutar como una aplicación independiente, no hay nada de malo en usar System.exit. en este caso, establecer un valor de salida es probablemente la forma más fácil (y también la más utilizada) de comunicar la falla o el éxito al proceso principal.

1

Está mal visto para salidas normales. Si "no todo va según lo previsto", System.exit está bien.

Actualización: Debo agregar que asumo que su '1' tiene un significado que está documentado en alguna parte.

1

También puede ser peligroso/problemático en entornos de servlets web.

Lanzar una excepción generalmente se considera la otra alternativa.

2

La política de nuestra compañía es que está bien (incluso se prefiere) llamar a System.exit (-1), pero solo en los métodos init(). Definitivamente lo pensaría dos veces antes de llamarlo durante el flujo normal de un programa.

1

Lanzar excepciones es la mejor manera de enviar información sobre un cierto error hacia arriba y hacia afuera de la aplicación.

Un número no le dice tanto como:

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

(o algo parecido a eso)

8

Estoy de acuerdo con el "lanzar una excepción" multitud. Una razón es que llamar a System.exit hace que el código sea difícil de usar si quieres que otro código pueda usarlo. Por ejemplo, si descubre que su clase sería útil desde una aplicación web, o algún tipo de aplicación que consuma mensajes, sería bueno permitir que esos contenedores tengan la oportunidad de lidiar con la falla de alguna manera. Un contenedor puede querer volver a intentar la operación, decidir iniciar sesión e ignorar el problema, enviar un correo electrónico a un administrador, etc.

Una excepción a esto sería su método main(); esto podría atrapar la excepción y llamar al System.exit() con algún valor que pueda ser reconocido por el proceso de llamada o el script de shell.

1

Creo que lanzar una excepción es lo que debes hacer cuando algo sale mal. De esta forma, si su aplicación no se ejecuta como una aplicación independiente, la persona que llama puede reaccionar ante ella y tiene alguna información sobre lo que salió mal. También es más fácil para la depuración porque también tiene una mejor idea de lo que salió mal cuando ve un seguimiento de la pila.

Una cosa importante a tener en cuenta es que cuando la excepción alcanza el nivel superior y hace que la VM salga, la VM devuelve un código de retorno de 1, por lo tanto, las aplicaciones externas que usan el código de retorno ven que algo salió mal.

El único caso donde creo que System.exit() tiene sentido es cuando su aplicación debe ser llamada por aplicaciones que no son Java y por lo tanto tiene que usar códigos de retorno para ver si su aplicación funcionó o no y desea esas aplicaciones tienen la posibilidad de reaccionar de manera diferente sobre diferentes cosas que van mal, es decir, necesita diferentes códigos de retorno.

3

System.exit() bloqueará, y creará un interbloqueo si el hilo que lo inició se utiliza en un gancho de desconexión.