Terminación de un programa Java

80

Descubrí formas de terminar (apagar o detener) mis programas Java. Encontré dos soluciones para ello.

  1. usando return;
    Cuando quiero salir o terminar la ejecución de mi programa, agrego esto.

  2. usando System.exit () ;
    A veces lo usé. Leí sobre Sytem.exit () en esta pregunta .

Entonces, sé un poco sobre ambos. Pero todavía estoy confundido sobre cómo funcionan realmente. Por favor, consulte los siguientes códigos ...

public class Testing {

public static void main(String... str) {
    System.out.println(1);
    System.exit(0);
    System.out.println(2);
    return;
 }
}

Estoy seguro de que 2 no aparecerá. Me gustaría saber por qué return;u otros códigos pueden escribir debajo de la declaración de System.exit(0);y cuál fue la definición real return;( porque es algo extraño para mí returnsin variables o valores ).

Cataclismo
fuente

Respuestas:

101

Llamar System.exit(0)(o cualquier otro valor para el caso) hace que la máquina virtual Java se cierre, terminando el proceso actual. El parámetro que pase será el valor de retorno que el javaproceso devolverá al sistema operativo. Puede realizar esta llamada desde cualquier lugar de su programa, y ​​el resultado siempre será el mismo: la JVM termina. Como esto es simplemente llamar a un método estático en Systemclase, el compilador no sabe qué hará y, por lo tanto, no se queja del código inalcanzable.

returndeclaración simplemente aborta la ejecución del método actual. Literalmente significa devolver el control al método de llamada . Si el método se declara como void(como en su ejemplo), entonces no necesita especificar un valor, ya que debería regresar void. Si se declara que el método devuelve un tipo en particular, debe especificar el valor que se devolverá, y este valor debe ser del tipo especificado.

returnharía que el programa se cierre solo si está dentro del mainmétodo de la clase principal que se está ejecutando. Si intenta poner código después, el compilador se quejará de un código inalcanzable, por ejemplo:

public static void main(String... str) {
    System.out.println(1);
    return;
    System.out.println(2);
    System.exit(0);
}

no se compilará con la mayoría de los compiladores, lo que produce un unreachable codeerror que apunta a la segunda System.out.printlnllamada.

Aleks G
fuente
14
  1. System.exit () es un método que hace que JVM salga.
  2. return simplemente devuelve el control a la función de llamada.
  3. return 8 devolverá el control y el valor 8 al método de llamada.
prady00
fuente
11

Porque System.exit()es solo otro método para el compilador. No lee con anticipación y se da cuenta de que todo el programa se cerrará en ese momento (la JVM se cierra). Su sistema operativo o shell puede leer el número entero que se devuelve en el System.exit()método. Es estándar para0 que signifique "el programa se cerró y todo salió bien" y cualquier otro valor para notificar un error. Depende del desarrollador documentar estos valores de retorno para cualquier usuario.

returnpor otro lado, es una palabra clave reservada que el compilador conoce bien. returndevuelve un valor y finaliza la ejecución de la función actual moviéndose hacia arriba en la pila hasta la función que la invocó (si la hubiera). En su código anterior, regresa voidya que no ha proporcionado nada para devolver.

indivisible
fuente
2
¿Realmente regresa null? ¿No es nada tan vacío? No puede regresar nullen el método con el tipo de retorno como void.
Keerthivasan
Tienes razón, cambiaré mi respuesta. Gracias por señalar el error.
indivisible
7

System.exit () termina la JVM. No se ejecuta nada después de System.exit (). El retorno se usa generalmente para salir de un método. Si el tipo de retorno es nulo, entonces puede usar return; Pero no creo que sea una buena práctica hacerlo en el método principal. No tiene que hacer nada para terminar un programa, a menos que haya un bucle infinito o algún otro flujo de ejecución extraño.

Karura91
fuente
6

Así que regresa; realmente no termina su programa java , solo finaliza su función java (void) . Porque en su caso la función es la función principal de su aplicación, return; también terminará la aplicación. Pero el regreso; en su ejemplo es inútil, porque la función terminará directamente después de este retorno de todos modos ...

El System.exit () terminará completamente su programa y cerrará cualquier ventana abierta.

ReeCube
fuente
4

Qué regresa; ¿media?

return;realmente significa que no devuelve nada void. Eso es.

por qué regresar; u otros códigos pueden escribir debajo de la declaración de System.exit (0);

Está permitido porque el compilador no sabe que la llamada System.exit(0)terminará el JVM. El compilador solo dará una advertencia: declaración de retorno innecesaria

Keerthivasan
fuente
4
  • Bueno, primero se usa System.exit (0) para terminar el programa y tener declaraciones debajo no es correcto, aunque el compilador no arroja ningún error.
  • un plano return;se utiliza en un método de tipo de retorno nulo para devolver el control de ejecución a su método padre.
anirudh
fuente
Eso es realmente extraño. Esperaba que el compilador arrojara un error de "Código inalcanzable".
user3932000
El compilador no sabe qué hace System.exit (0) (ni debería hacer tal suposición, ya que técnicamente podría hacer algo de magia de ClassLoader para cargar una implementación diferente de System.exit () que no hace que salga ),
David Liu
Sí, supongo que tienes razón. Quizás una advertencia tenga sentido.
anirudh