2010-04-16 18 views
9

Estoy escribiendo un programa de aplicación usando swing. Necesito salir de la aplicación haciendo clic en JButton para eso puedo usar System.exit() o debo usar algunos otros métodos, que es la mejor práctica. Si llamar al System.exit() no es una buena práctica, indique la razón y explique la forma alternativa de salir de la aplicación.System.exit (0) en java

Respuesta

6

Personalmente, considero una buena práctica dejar que la aplicación salga sola: si escribe una clase principal con un main(String[] args), con código vacío, ejecutarlo saldrá silenciosamente del programa Java.

Pero, en la mayoría de ocasiones, como la mayoría de los desarrolladores de, cuento con System.exit(/an exit code/), especialmente para aplicaciones Swing, donde la oscilación EDT se ejecutará sin fin, como escribió justkt .. El drawxback conocido de este método es que la mayoría de código applciation no se llama, lo que evito configurando un gancho de apagado llamando al Runtime.addShutdownHook(Thread), que me permitirá limpiar la aplicación (cerrar hilos, etc.).

+1

Dejar que una aplicación salga solo funciona para aplicaciones que no son de GUI, pero con Swing tiene la cola de eventos y el hilo de eventos, que no controla, que no se cerrarán sin algún formulario (programático o haciendo clic una 'x' en un JFrame) de intervención del usuario. – justkt

3

Si es necesario establecer un código de salida para su aplicación, se tienen que utilizar System.exit (creo).

Pero cuando no necesitas un código específico (o 0 está bien), preferiría que la JVM terminara "naturalmente", lo que sucede cuando ya no quedan más hilos (no demoníacos).

Normalmente, llegaría al final de su método principal.

Yo tendría cuidado con System.exit porque puede haber otros temas que todavía tienen que hacer algo, y salir sin necesidad de apagarlos correctamente puede causar daño. Por ejemplo, la base de datos incrustada podría necesitar limpiar sus búferes.

Si sabe acerca de estos temas, por lo general puede arreglar para que terminen con gracia. Si no sabe qué subprocesos se están ejecutando en su programa, tiene problemas mayores ...

+0

Si el método principal arroja una excepción, java generará otro código de salida (130, si lo recuerdo correctamente). – whiskeysierra

2

System.exit puede ser malo al menos cuando tiene múltiples subprocesos o recursos que deben cerrarse correctamente (que viven fuera de JVM) Si su aplicación no está saliendo cuando cree que debería, entonces debe averiguar cuál es el problema y no simplemente llamar a System.exit().

La única razón para llamar System.exit() sería dar un cierto código de salida estándar ninguno.

3

En general, el único momento en que tiene que hacer un System.exit (n) es si desea salir de un programa de línea de comandos con un código de error de modo que todo lo que está supervisando el programa puede detectar el código de error.

Esto es muy útil, por ejemplo, si está escribiendo un programa diseñado para ser ejecutado desde un script de shell.

Como dicen otras respuestas, sin embargo, si está utilizando hilos entonces usted debe hacer todo lo posible para cerrarlas con gracia antes de considerar una System.exit (n)

10

En general, llamando System.exit(...) en cualquier lugar, pero el "principal" método de una aplicación puede ser problemático por (al menos) las siguientes razones.

  • Es un impedimento para reutilizar su código.

  • Hace las pruebas unitarias duras.Por ejemplo, si su código llama al System.exit cuando sus pruebas JUnit ejercen algún tipo de manejo de errores, ¡es el final de su secuencia de prueba!

El caso específico de llamar System.exit(...) en el oyente botón para el botón de "salida" no es tan malo. Es poco probable que quiera reutilizar el oyente del botón en algún lugar que tampoco requiera este comportamiento. Además, probablemente pueda encontrar una solución alternativa para el enigma de la prueba unitaria; p.ej. ¡no pruebes la unidad de ese método en particular!

Sin embargo, creo que todavía intentaré que la salida sea diferente. Por ejemplo, haga que el método main lonce todo y luego bloquee en un CountDownLatch, luego haga que el oyente del botón reduzca el bloqueo. Cuando se desbloquea el método main, ejecuta el código de apagado correspondiente y regresa o sale según corresponda.

+0

+1 para hace que la prueba de la unidad sea difícil! "¿Por qué no están completando mis pruebas de unidad?" –

Cuestiones relacionadas