System.exit()
se puede usar para ejecutar ganchos de apagado antes de que se cierre el programa. Esta es una forma conveniente de manejar el apagado en programas más grandes, donde todas las partes del programa no pueden (y no deben) ser conscientes entre sí. Luego, si alguien quiere renunciar, simplemente puede llamarSystem.exit()
, y los ganchos de cierre (si están configurados correctamente) se encargan de hacer todas las ceremonias de cierre necesarias, como cerrar archivos, liberar recursos, etc.
"Este método nunca vuelve normalmente". significa solo que el método no volverá; Una vez que un hilo va allí, no volverá.
Otra forma, quizás más común, de salir de un programa es simplemente llegar al final del main
método. Pero si hay subprocesos no daemon en ejecución, no se cerrarán y, por lo tanto, la JVM no se cerrará. Por lo tanto, si tiene hilos no daemon, necesita otros medios (además de los ganchos de cierre) para cerrar todos los hilos no daemon y liberar otros recursos. Si no hay otros subprocesos que no sean daemon, al regresar de main
cerrará la JVM y llamará a los ganchos de cierre.
Por alguna razón, los ganchos de cierre parecen ser un mecanismo infravalorado y mal entendido, y la gente está reinventando la rueda con todo tipo de hacks personalizados patentados para abandonar sus programas. Yo recomendaría usar ganchos de apagado; todo está allí en el tiempo de ejecución estándar que usarás de todos modos.
Runtime.getRuntime().halt()
)En ese caso, no es necesario. No se habrán iniciado subprocesos adicionales, no está cambiando el código de salida (que por defecto es 0), básicamente no tiene sentido.
Cuando los documentos dicen que el método nunca regresa normalmente, significa que la línea de código posterior es efectivamente inalcanzable, aunque el compilador no sabe que:
Se lanzará una excepción o la VM terminará antes de regresar. Nunca "simplemente regresará".
Es muy raro que valga la pena llamar a
System.exit()
IME. Puede tener sentido si está escribiendo una herramienta de línea de comandos y desea indicar un error a través del código de salida en lugar de simplemente lanzar una excepción ... pero no recuerdo la última vez que lo usé en el código de producción normal .fuente
System.exit()
nunca se completará normalmente: siempre se completará con una excepción o con el cierre de la máquina virtual (que en realidad no está cubierto en el JLS).El método nunca regresa porque es el fin del mundo y ninguno de sus códigos se ejecutará a continuación.
Su aplicación, en su ejemplo, saldría de todos modos en el mismo lugar en el código, pero si usa System.exit. tiene la opción de devolver un código personalizado al entorno, por ejemplo, digamos
¿Quién va a hacer uso de su código de salida? Un script que llamó a la aplicación. Funciona en Windows, Unix y todos los demás entornos programables.
¿Por qué devolver un código? Para decir cosas como "No tuve éxito", "La base de datos no respondió".
Para ver cómo obtener el valor de un código de salida y usarlo en un script de shell de Unix o un script de cmd de Windows, puede consultar esta respuesta en este sitio
fuente
System.exit(0)
termina la JVM. En ejemplos simples como este es difícil percibir la diferencia. El parámetro se devuelve al sistema operativo y normalmente se usa para indicar una terminación anormal (por ejemplo, algún tipo de error fatal), por lo que si llama a Java desde un archivo por lotes o script de shell, podrá obtener este valor y tener una idea si la solicitud fue exitosaTendría un gran impacto si llamaras
System.exit(0)
a una aplicación implementada en un servidor de aplicaciones (piénsalo antes de probarlo).fuente
En aplicaciones que pueden tener complejas conexiones de cierre, este método no debe llamarse desde un hilo desconocido.
System.exit
nunca sale normalmente porque la llamada se bloqueará hasta que se termine la JVM. Es como si el código que se está ejecutando tiene el enchufe de alimentación conectado antes de que pueda terminar. Las llamadasSystem.exit
iniciarán los ganchos de cierre del programa y cualquier subproceso queSystem.exit
bloquee hasta que finalice el programa. Esto tiene la implicación de que si el gancho de apagado a su vez envía una tarea al subproceso desde el queSystem.exit
se llamó, el programa se bloqueará.Estoy manejando esto en mi código con lo siguiente:
fuente
Aunque la respuesta fue realmente útil, pero de alguna manera se perdió algunos detalles adicionales. Espero que a continuación le ayude a comprender el proceso de apagado en Java, además de la respuesta anterior:
PD: La JVM puede apagarse en un ordenada o abrupta .
fuente
NUNCA se debe llamar
System.exit(0)
por estos motivos:Salir del programa "normalmente" proporciona el mismo código de salida al sistema operativo, por
System.exit(0)
lo que es redundante.Si su programa no puede salir "normalmente", ha perdido el control de su desarrollo [diseño]. Siempre debe tener el control total del estado del sistema.
Por cierto: devolver otros códigos de retorno distintos de 0 tiene sentido si desea indicar la finalización anormal del programa.
fuente
Se necesita System.exit
En su caso, hace exactamente lo mismo que el simple return-from-main.
fuente
exit
es su única opción allí.exit
. No es la única opción, pero definitivamente es una opción que vale la pena considerar.La especificación del lenguaje Java dice que
Significa que debe usarlo cuando tiene un programa grande (bueno, al menos más grande que este) y desea finalizar su ejecución.
fuente
Si tiene otro programa ejecutándose en la JVM y usa System.exit, ese segundo programa también se cerrará. Imagine, por ejemplo, que ejecuta un trabajo java en un nodo del clúster y que el programa java que administra el nodo del clúster se ejecuta en la misma JVM. Si el trabajo usara System.exit, no solo saldría del trabajo sino que también "cerraría el nodo completo". No podrá enviar otro trabajo a ese nodo del clúster ya que el programa de administración se ha cerrado accidentalmente.
Por lo tanto, no use System.exit si desea poder controlar su programa desde otro programa java dentro de la misma JVM.
Use System.exit si desea cerrar la JVM completa a propósito y si desea aprovechar las posibilidades que se han descrito en las otras respuestas (por ejemplo, desconectar ganchos: gancho de apagado de Java , valor de retorno distinto de cero para la línea de comandos llamadas: cómo obtener el estado de salida de un programa Java en un archivo por lotes de Windows ).
También eche un vistazo a las excepciones de tiempo de ejecución: System.exit (num) o arroje una RuntimeException desde main?
fuente