1. Información general
En este tutorial, veremos qué significa System.exit en Java.
Veremos sus propósitos, dónde usarlo y cómo usarlo. También veremos cuál es la diferencia al invocarlo con diferentes códigos de estado.
2. ¿Qué es System.exit ?
System.exit es un método nulo . Toma un código de salida, que pasa al script o programa de llamada.
Salir con un código cero significa una salida normal:
System.exit(0);
Podemos pasar cualquier número entero como argumento al método. Un código de estado distinto de cero se considera una salida anormal.
Llamar al método System.exit finaliza la JVM que se está ejecutando actualmente y sale del programa. Este método no regresa normalmente.
Esto significa que el código subsiguiente después de System.exit es efectivamente inalcanzable y, sin embargo, el compilador no lo sabe.
System.exit(0); System.out.println("This line is unreachable");
No es una buena idea cerrar un programa con System.exit (0) . Nos da el mismo resultado de salir del método principal y también detiene la ejecución de las líneas siguientes, también el hilo que invoca los bloques System.exit hasta que la JVM termina. Si un gancho de cierre envía una tarea a este hilo, conduce a un punto muerto.
3. ¿Por qué lo necesitamos?
El caso de uso típico de System.exit es cuando hay una condición anormal y necesitamos salir del programa inmediatamente.
Además, si tenemos que terminar el programa desde un lugar que no sea el método principal, System.exit es una forma de lograrlo.
4. ¿Cuándo lo necesitamos?
Es común que un script se base en los códigos de salida de los comandos que invoca. Si dicho comando es una aplicación Java, System.exit es útil para enviar este código de salida.
Por ejemplo, en lugar de lanzar una excepción, podemos devolver un código de salida anormal que luego puede ser interpretado por el script de llamada.
O podemos usar System.exit para invocar cualquier gancho de apagado que hayamos registrado. Estos enlaces se pueden configurar para limpiar los recursos retenidos y salir de forma segura de otros subprocesos que no son demonios.
5. Un ejemplo simple
En este ejemplo, intentamos leer un archivo y, si existe, imprimimos una línea. Si el archivo no existe, salimos del programa con System.exit del bloque catch.
try { BufferedReader br = new BufferedReader(new FileReader("file.txt")); System.out.println(br.readLine()); br.close(); } catch (IOException e) { System.exit(2); } finally { System.out.println("Exiting the program"); }
Aquí, debemos tener en cuenta que el bloque finalmente no se ejecuta si no se encuentra el archivo. Debido a que el System.exit en los bloques catch sale de la JVM y no permite la finalmente bloquear a ejecutar.
6. Elección de un código de estado
Podemos pasar cualquier número entero como código de estado, pero la práctica general es que System.exit con código de estado 0 es normal y otros son salidas anormales.
Tenga en cuenta que esto es sólo una "buena práctica" y no es una regla estricta que le interese al compilador.
Además, vale la pena señalar que cuando invocamos un programa Java desde la línea de comandos, se tiene en cuenta el código de estado.
En el siguiente ejemplo, cuando intentamos ejecutar SystemSalirExample.class, si sale de la JVM llamando al System.exit con un código de estado distinto de cero, el siguiente eco no se imprime.
java SystemExitExample && echo "I will not be printed"
Para que nuestro programa pueda comunicarse con otras herramientas estándar, podríamos considerar seguir los códigos estándar que los sistemas relacionados usan para comunicarse.
Por ejemplo, los códigos de estado de UNIX definen 128 como el estándar para "argumento no válido para salir". Por lo tanto, podría ser una buena idea usar este código cuando necesitemos que nuestro código de estado se comunique al sistema operativo. De lo contrario, somos libres de elegir nuestro código.
7. Conclusión
En este tutorial, discutimos cómo funciona System.exit cuándo usarlo y cómo usarlo.
Es una buena práctica utilizar el manejo de excepciones o declaraciones de retorno simples para salir de un programa cuando se trabaja con servidores de aplicaciones y otras aplicaciones normales. El uso del método System.exit se adapta mejor a aplicaciones basadas en scripts o donde se interpretan los códigos de estado.
Puede consultar los ejemplos proporcionados en este artículo en GitHub.