Diferencia en el sistema. exit (0), System.exit (-1), System.exit (1) en Java

280

Me gustaría saber la diferencia entre lo siguiente en Java

System.exit(0);
System.exit(-1);
System.exit(1);

¿Cuándo debo usar el código anterior de manera adecuada?

giri
fuente
17
¿Por qué no marcó la respuesta como la 'mejor respuesta' para que haya una marca verde? ¡ayuda a otras personas a saber cuál es el mejor!
Saksham Goyal

Respuestas:

253

El parámetro de salida debe calificar si la ejecución del programa fue buena o mala. Es una especie de herencia de lenguajes de programación más antiguos donde es útil saber si algo salió mal y qué salió mal.

El código de salida es

  • 0 cuando la ejecución fue bien;
  • 1, -1, whatever != 0Cuando se produjo algún error, puede utilizar valores diferentes para diferentes tipos de errores.

Si estoy en lo correcto, los códigos de salida solían ser solo números positivos (quiero decir en UNIX) y según el rango:

  • 1-127son códigos definidos por el usuario (generados al llamar exit(n))
  • 128-255son códigos generados por terminación debido a diferentes señales de unix como SIGSEGV o SIGTERM

Pero no creo que deba preocuparse mientras codifica en Java, es solo un poco de información. Es útil si planea hacer que sus programas interactúen con herramientas estándar.

Jack
fuente
31
También tenga en cuenta que un código de salida de 0 cuenta como verdadero en el shell y cualquier otro código cuenta como falso. Entonces java MyApp && echo successimprimirá "éxito" si MyApp tiene un código de salida de 0, es decir, si llama exit(0)o simplemente llega al final del método principal sin un error.
sepp2k
16
Por favor, siempre cuide el código de salida si su aplicación se puede usar en un script. Es muy molesto tener una herramienta que falla silenciosamente en el medio de su secuencia de comandos (o imprimir un seguimiento de pila y salir con 0).
Doncho Gunchev
66
Una cosa a tener en cuenta: cuando devuelve -1, el mayor número positivo posible se devuelve en un contexto sin signo (en la representación de complemento a dos -1 siempre establece todos los bits independientemente del número de bytes en el número). Entonces -1 generalmente se devuelve cuando devuelve un error no específico y no desea que choque con posibles códigos de error que ya están definidos y documentados. por ejemplo, el código de error 1 podría haberse documentado como error de escritura; el código de error 2 podría ser un error de lectura, etc.
Nylon Smile
Es un 'tipo de herencia' de la salida * de Unix (2) `en realidad.
Marqués de Lorne
127

Zero => Todo bien

Positive => Algo que esperaba que pudiera salir mal salió mal (línea de comando incorrecta, no se puede encontrar el archivo, no se pudo conectar al servidor)

Negative=> Algo que no esperaba en absoluto salió mal (error del sistema - excepción no anticipada - terminación forzada externamente, por ejemplo kill -9)

(los valores superiores a 128 son en realidad negativos, si los considera como binarios con signo de 8 bits o dos complementarios)

Aquí hay un montón de buenos códigos de salida estándar

robert
fuente
12
"Algo que esperaba que saliera mal salió mal" suena como "Todo bien".
tobe
"Se puede esperar razonablemente que yo, como desarrollador, anticipe" Error de usuario frente a error del sistema; En realidad, esto está cubierto por el póster superior: los valores 128-255 son -ve wrt binario con signo de 8 bits.
robert
66
@tobe Es realmente más como "Algo que esperaba que saliera mal salió realmente mal";)
Marcel Hernández
1
Bash trata los códigos de salida como de 8 bits sin signo, y modificará 256, por lo que un -1 se convierte en 255 y 256 se convierte en 0. Las señales (en una muerte, por ejemplo kill -15) a menudo dan como resultado un código de salida 128+signal, pero (aparte de 9) se pueden manejar y devolver un código de salida diferente. El -de kill -15es el número de marcas como una señal y no un pid, no hacen que la negativa de la señal.
Mateo
Cuando lo haces System.exit(-1)y luego en tu caparazón echo $?obtienes '255'. Es por eso que dije que los números negativos son errores del sistema, no por el '-' en el parámetro kill. ¿En serio pensaste que eso era lo que yo pensaba? Pero gracias por explicar el mecanismo por el cual Bash construye estos códigos.
robert
51

System.exit(system call)finaliza la máquina virtual Java actualmente en ejecución iniciando su secuencia de apagado. El argumento sirve como un código de estado .

Por convención, un código de estado distinto de cero indica una terminación anormal.

  System.exit(0) or EXIT_SUCCESS;  ---> Success
  System.exit(1) or EXIT_FAILURE;  ---> Exception
  System.exit(-1) or EXIT_ERROR;   ---> Error

Leer más en Java

En sistemas Unix y Linux, 0para ejecuciones exitosas y 1superiores para ejecuciones fallidas.

Premraj
fuente
3
Esta respuesta parece estar en contradicción con la respuesta de @ robert
amdev
No se ha mencionado en el documento de Java que el código de salida -1 representa ERROR, en cambio la redacción es "estado - Estado de terminación. Por convención, un código de estado distinto de cero indica una terminación anormal".
Damith
EXIT_*no existe en Java
juanchito
6

exit(0)generalmente se usa para indicar la terminación exitosa. exit(1)o exit(-1)cualquier otro valor distinto de cero indica una terminación fallida en general.

Purushottam Sadh
fuente
Lo que me disculpa es que el argumento es pasado por el codificador. No hay un valor de retorno por el método. ¿Cómo puede indicar el resultado de la terminación?
anKotliner
4

Aquí está la respuesta.

System.exit(0);// normal termination - Successful - zero
System.exit(-1);//Exit with some Error
System.exit(1);//one or any positive integer // exit with some Information message
Lova Chittumuri
fuente
2

Un buen truco es que cualquier código de error> 255 se convertirá en el código de error% 256. Se debe tener especial cuidado con esto si están usando un código de error personalizado> 255 y esperan el código de error exacto en la lógica de la aplicación. http://www.tldp.org/LDP/abs/html/exitcodes.html

nómada
fuente
1

La diferencia de los números puestos en system.exit () se explica en otras respuestas. pero la DIFERENCIA REAL es que System.exit () es un código que se devuelve al proceso de invocación. Si el sistema operativo invoca el programa, el código de retorno le indicará al sistema operativo que si system.exit () devolvió 0, todo estaba bien, pero si algo salió mal, entonces podría haber algunos controladores para eso en el proceso padre

parsa
fuente
0

Como otros responden 0significando éxito, de lo contrario.

Si utiliza el archivo bat (ventana) System.exit(x)tendrá efecto.

Código java (myapp):

if (error < 2){
    help();
    System.exit(-1);    
}
else{
    doSomthing();
    System.exit(0);
}

}

archivo bat:

java -jar myapp.jar
if %errorlevel% neq 0 exit /b %errorlevel%
rem -- next command if myapp is success --
nguyên
fuente
-2

System.exit (0) por convención, un código de estado distinto de cero indica una terminación anormal.

System.exit (1): significa que la terminación no se realizó correctamente debido a algún error

androminor
fuente
El argumento siempre "sirve como un código de estado". No solo cuando es cero.
Marqués de Lorne
Oh si . lo siento mi mala EJP
androminor
-7
class calc{
public static void main(String args[])
{
    int a, b, c;
    char ch;
    do{

        Scanner s=new Scanner(System.in);

                System.out.print("1. Addition\n");
                System.out.print("2. Substraction\n");
                System.out.print("3. Multiplication\n");
                System.out.print("4. Division\n");
                System.out.print("5. Exit\n\n");

                System.out.print("Enter your choice : ");
                ch=s.next().charAt(0);
                    switch (ch)
                    {
                        case '1' :
                        Addition chose1=new Addition();
                        chose1.add();
                        break;

                        case '2' :
                        Substraction chose2=new Substraction();
                        chose2.sub();
                        break;

                        case '3' :
                        Multiplication chose3= new Multiplication();
                        chose3.multi();
                        break;

                        case '4' :
                        Division chose4=new Division();
                        chose4.divi();
                        break;

                        case '5' :
                        System.exit(0);
                        break;

                        default :
                        System.out.print("wrong choice!!!");
                        break;
                    }
        System.out.print("\n--------------------------\n");                     
    }while(ch !=5); 
}

}

En el código anterior cuando su System.exit (0); y cuando presiono el caso 5 sale correctamente pero cuando uso System.exit (1); y presiono el caso 5 sale con error y nuevamente cuando intento con el caso 15 sale correctamente por esto llegué a saber que, cada vez que ponemos un argumento int dentro, especifica que, toma el carácter de esa posición, es decir, si pongo (4) que significa tomar el 5to carácter de esa cadena si es (3) entonces significa tomar el 4to carácter de esa cadena ingresada

LEYENDA MORTAL
fuente