2010-07-28 8 views
36

Nunca he entendido correctamente el uso de la instrucción finally. ¿Puede alguien decirme cuál es la diferencia entre:cómo usar finalmente

try { 
    a; 
    block; 
    off; 
    statements; 
} catch (Exception e) { 
    handle; 
    exception; 
    e; 
} finally { 
    do; 
    some; 
    cleanup; 
} 

por un lado, y:

try { 
    a; 
    block; 
    off; 
    statements; 
} catch (Exception e) { 
    handle; 
    exception; 
    e; 
} 
do; 
some; 
cleanup; 

Por otro

Respuesta

35

difieren si

  • la try -bloque completa lanzando un java.lang.Throwable que no es un java.lang.Exception, por ejemplo, porque se trata de un java.lang.Error como AssertionError o OutOfMemoryError.
  • el try-bloque finaliza abruptamente el uso de un estado de flujo de control de tal continue, break o return
  • la captura de bloque se completa bruscamente (por tirar cualquier arrojadiza, o el uso de un estado de flujo de control)

Más en general, el lenguaje java garantiza que se ejecuta un bloque finally antes de que finalice el try-statement. (Tenga en cuenta que si el try-declaración no se completa, no hay ninguna garantía sobre el fin. Una declaración puede no completarse por una variedad de razones, incluyendo la desconexión del hardware, el apagado del sistema operativo, VM apagado (por ejemplo, debido a System.exit), el hilo en espera (Thread.suspend(), synchronized, Object.wait(), Thread.sleep()) o ser de otro modo ocupado (bucles sin fin, ,,,).

por lo tanto, un bloque finally es un lugar mejor para acciones de limpieza que el extremo del cuerpo del método, pero en sí mismo, todavía no puede garantizar la limpieza exeuction

7

con buen estilo de codificación que no desea hacer una captura todo como a continuación.

try{ 
    [some task] 
} 
catch 
{ 
} 

Lo que usted querría hacer es atrapar errores conocidos específicos.

try{ 
    [some task] 
} 
catch(Exception ex) 
{ 
    if([known execption]) 
    [ignore] 
    else 
    throw(ex); 
} 
[Cleanup] 

En este caso, su código de limpieza no se ejecutará en caso de que se vuelva a producir un error. Así que agregamos el finalmente que se ejecutará incluso si se produce un nuevo error.

try{ 
    [some task] 
} 
catch(Exception ex) 
{ 
    if([known execption]) 
    [ignore] 
    else 
    throw(ex); 
} 
finally 
{ 
    [Cleanup] 
} 
27

finally bloque se ejecuta siempre. bloque

finally se utiliza para la limpieza, como liberar recursos utilizados en try/catch, conexiones db cierre, tomas de corriente, etc .. incluso cuando una excepción no controlada se produce dentro de su bloque try/catch.

La única vez que el bloque de finally no ejecuta es cuando se llama system.exit() en try/catch o se produce algún error en lugar de una excepción.

El error en la descripción anterior significa cuando la aplicación Java se cierra con condiciones como error de falta de memoria. Veo algunos votos abajo :(por esta razón parece.

+2

corrección:. un bloque finally _es_ ejecuta cuando se lanza un java.lang.Error no podría ejecutar con éxito, pero sí ejecutar Además, hay aire adicional.. condiciones que pueden frustrar la ejecución de un bloque finally, consulte mi respuesta para una lista incompleta. – meriton

+0

Nota: Si la JVM se cierra mientras se está ejecutando el código try o catch, entonces el bloque finally no se puede ejecutar. Del mismo modo, si el subproceso que ejecuta el código try o catch se interrumpe o se cancela, el bloque finally no se puede ejecutar aunque la aplicación como un todo continúe. - https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html – Hansa

18

La diferencia principal es que la sección catch podría arrojar una excepción, salir de un bloque circundante, o regresar del método actual. En ese caso do; some; cleanup; no es . ejecutados

con un bloque finally, es garantizado que ese código se ejecutará

+0

¿Finalmente se garantiza que se ejecutará? http://stackoverflow.com/questions/464098/does-a-finally-block-always-run –

+0

Sí, no en el caso de System.exit(), eso es cierto. O bien, ya sabes, un bloqueo de JVM. – Dan

+2

... o un interbloqueo, o ... - la regla real es: se garantiza que se ha ejecutado un bloque finalmente cuando/si la instrucción try- (catch) -finally se completa. – meriton

10

es básicamente una mala idea para capturar todas las excepciones -. por lo que debe tener en cuenta lo que sucederá si un no capturadas se propaga de excepción de tu try/catch o try/catch/finally block. Finalmente los bloques te permiten a limpiar en el camino de salida.

también:

  • El bloque catch podría lanzar una excepción
  • Es posible que desee volver desde el bloque try

En resumen, si quieres algo de código que se ejecuta cuando se deje el bloque try/catch sin embargo, lo está dejando (aparte del proceso que se terminó muy duro), finalmente es su amigo.

7

El bloque "finally" siempre se ejecutará.

En el segundo ejemplo, la limpieza no se produciría si el bloque catch relanzamientos la excepción, o si se produjo una excepción no capturada en el bloque try.

+0

Existen numerosas condiciones en las que finalmente no se ejecuta (c.f. mi respuesta), pero tiene razón en que arrojar excepciones (o usar declaraciones de flujo de control) no se encuentran entre ellas. – meriton

3

De this foro sobre GeekInterview:

El bloque finally siempre se ejecuta cuando el bloque try. Esto asegura que el bloque finally se ejecuta incluso si ocurre una excepción inesperada. Pero finalmente es útil para algo más que el manejo de excepciones: permite que el programador evite que el código de limpieza sea anulado accidentalmente por un retorno, continuación o interrupción. Poner el código de limpieza en un bloque finally es siempre una buena práctica, incluso cuando no se prevén excepciones.

1

Simplemente una línea de explicación:

independientemente de si se detectó una excepción o no, los códigos en el bloque finally obtendrá ejecutado.

la diferencia entre las dos piezas que dio aquí es: los códigos en la pieza sin usar finally nunca se ejecutarán.

para comprender correctamente finally, todo lo que necesita saber es que finally = ¡garantía!

que se puede utilizar para limpiar, para ayudar w/o la facilidad de uso para volver a intentar algo

0

En el primer ejemplo, el bloque finally siempre se ejecuta incluso si tiene una instrucción de retorno en la cláusula try. La única vez que no se ejecuta es cuando tiene System.exit (0).

+0

hay muchas otras condiciones donde finalmente no se ejecuta, c.f. mi respuesta (que no pretende darles a todos ...) – meriton

Cuestiones relacionadas