¿Cuándo deberíamos llamar a System.exit en Java?

Resuelto pierrotlefou asked hace 14 años • 10 respuestas

En Java, ¿cuál es la diferencia con o sin System.exit(0)el siguiente código?

public class TestExit
{      
    public static void main(String[] args)
    { 
        System.out.println("hello world");

        System.exit(0);  // is it necessary? And when it must be called? 
    }      
}

El documento dice: "Este método nunca regresa normalmente". ¿Qué significa?

pierrotlefou avatar Sep 15 '10 15:09 pierrotlefou
Aceptado

System.exit()se puede utilizar para ejecutar ganchos de apagado antes de que se cierre el programa. Esta es una manera conveniente de manejar el cierre de programas más grandes, donde todas las partes del programa no pueden (y no deben) estar conscientes entre sí. Luego, si alguien quiere salir, simplemente puede llamar System.exit()y los ganchos de cierre (si están configurados correctamente) se encargan de realizar todas las ceremonias de cierre necesarias, como cerrar archivos, liberar recursos, etc.

"Este método nunca regresa normalmente". significa simplemente que el método no volverá; Una vez que un hilo va allí, no vuelve.

Otra forma, quizás más común, de salir de un programa es simplemente llegar al final del mainmétodo. Pero si hay subprocesos que no son demonios en ejecución, no se cerrarán y, por lo tanto, la JVM no saldrá. Por lo tanto, si tiene subprocesos que no son demonios, necesita otros medios (además de los ganchos de apagado) para cerrar todos los subprocesos que no son demonios y liberar otros recursos. Si no hay otros subprocesos que no sean demonios, regresar maincerrará la JVM y llamará a los ganchos de apagado.

Por alguna razón, los ganchos de cierre parecen ser un mecanismo infravalorado e incomprendido, y la gente está reinventando la rueda con todo tipo de trucos personalizados y patentados para cerrar sus programas. Recomendaría el uso de ganchos de apagado; todo está ahí en el tiempo de ejecución estándar que usará de todos modos.

Joonas Pulakka avatar Sep 15 '2010 08:09 Joonas Pulakka

En ese caso, no es necesario. No se habrán iniciado subprocesos adicionales, no cambiará 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 siguiente es efectivamente inalcanzable, aunque el compilador no lo sepa:

System.exit(0);
System.out.println("This line will never be reached");

O se generará una excepción o la VM finalizará antes de regresar. Nunca "simplemente regresará".

Es muy raro que valga la pena llamar System.exit()a IME. Puede tener sentido si estás escribiendo una herramienta de línea de comandos y quieres indicar un error a través del código de salida en lugar de simplemente generar una excepción... pero no recuerdo la última vez que lo usé en código de producción normal. .

Jon Skeet avatar Sep 15 '2010 08:09 Jon Skeet

El método nunca regresa porque es el fin del mundo y nada de su código se ejecutará a continuación.

Su aplicación, en su ejemplo, saldría de todos modos en el mismo lugar del código, pero si usa System.exit. tienes la opción de devolver un código personalizado al entorno, como, por ejemplo

System.exit(42);

¿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? Decir cosas como “No lo logré”, “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 Unix o un script cmd de Windows, puede consultar esta respuesta en este sitio.

mico avatar Sep 15 '2010 09:09 mico