2010-12-30 17 views
92

Estoy revisando algunos códigos nuevos. El programa solo tiene un intento y un bloqueo final. Como se excluye el bloque catch, ¿cómo funciona el bloque try si encuentra una excepción o algo que se pueda arrojar? ¿Va directamente al bloque final?Java Try Catch Finally blocks without Catch

+2

posible duplicado de [Diferencia entre la captura try-try-finally y] (http://stackoverflow.com/questions/2854910/difference-between-try-finally-and-try-catch) –

+22

@ mP Todos deberían hacer revisiones de códigos y hacerles preguntas es cómo aprender y mejorar. –

Respuesta

97

Si cualquiera de los códigos en el bloque try puede lanzar una excepción marcada, tiene que aparecer en la cláusula throws de la firma del método. Si se lanza una excepción sin marcar, se borra del método.

El bloque finally siempre se ejecuta, ya sea que se genere una excepción o no.

+8

El primer párrafo no es necesariamente cierto. Los bloques de prueba se pueden anidar. Cualquier excepción no detectada, sin marcar o no, saldrá burbujeante del método. –

+4

Se pueden anidar bloques de prueba, pero no lo recomendaría. No escribo código de esa manera. – duffymo

+1

@duffymo: ¿Qué significa "salido del método"? – todayILearned

1

¿No lo intenta con ese programa? Finalmente se bloqueará y se ejecutará el bloque finally, pero la excepción no se manejará. ¡Pero, esa excepción puede ser anulada en el bloque finally!

2

¿Cómo funciona el bloque try si encuentra una excepción o algo throwable

La excepción es lanzada fuera del bloque, al igual que en cualquier otro caso en que no está atrapado.

El bloque finally se ejecuta independientemente de cómo se salga el bloque try, independientemente de si hay alguna captura, independientemente de si hay una captura coincidente.

Los bloques catch y finally son partes ortogonales del bloque try. Puedes tener cualquiera o ambos. Con Java 7, ¡usted no podrá tener ninguno!

4

El bloque finally se ejecuta siempre después de que finaliza el try block, ya sea que try final sea normal o anormal debido a una excepción, er, throwable.

Si se produce una excepción por parte del código dentro del bloque try, entonces el método actual simplemente vuelve a lanzar (o continúa lanzando) la misma excepción (después de ejecutar el bloque finally).

Si el bloque finally arroja una excepción/error/throwable, y ya hay un throwable pendiente, se pone feo. Francamente, me olvido exactamente qué sucede (tanto para mi certificación hace años). I think ambos throwables se vinculan entre sí, pero hay algún vudú especial que tienes que hacer (es decir, una llamada a un método que tendría que buscar) para obtener el problema original antes de que el "finalmente" vomite, er, vomitó.

Por cierto, try/finally es una cosa bastante común que hacer para la gestión de recursos, ya que Java no tiene destructores.

E.g. -

r = new LeakyThing(); 
try { useResource(r); } 
finally { r.release(); } // close, destroy, etc 

"por fin", uno más consejo: si hace se molestan en poner en una captura, ya sea específica de captura (esperado) subclases arrojadizos, o simplemente coger "Throwable", no "excepción" , para una trampa de error general catch-all.Demasiados problemas, como goofs reflexión, lanzar "Errores" en lugar de "Excepciones", y los que se deslice justo al lado de cualquier "todo" ni codificado como:

catch (Exception e) ... // doesn't really catch *all*, eh? 

hacer esto en su lugar:

catch (Throwable t) ... 
+0

Ver la respuesta de Carlos Heuberger a continuación para la parte fea. –

1

El bloque finally se ejecuta después de que finaliza el bloque try. Si algo se arroja dentro del bloque try cuando sale, se ejecuta el bloque finally.

77

Una pequeña nota sobre try/finally: El fin siempre se ejecutará a menos

  • System.exit() se llama.
  • La JVM falla.
  • El bloque try{} nunca termina (por ejemplo, bucle sin fin).
+2

¿Qué pasa con 'try {..} catch {throw ..} finally {..}'? Creo que finalmente no se ejecutará – sbeliakov

+8

En ese caso, finalmente se llamará. Solo la excepción original se pierde. –

+0

Finalmente, tampoco se ejecutará si llama antes a System.exit(). –

30

La especificación del lenguaje Java (1) describe cómo se ejecuta try-catch-finally. No tener captura es equivalente a no tener una captura capaz de atrapar el Lanzable dado.

  • Si la ejecución del bloque try termina abruptamente debido a un lanzamiento de un valor V, entonces no es una opción:
    • Si el tipo de tiempo de ejecución de V se puede asignar al parámetro de cualquier cláusula catch de la sentencia try, entonces ...
      ...
    • Si el tipo de tiempo de ejecución de la V no se puede asignar al parámetro de cualquier cláusula catch de la sentencia try, entonces el bloque finally se ejecuta. A continuación, hay una opción:
      • Si el bloque finally se completa con normalidad, entonces la instrucción try termina abruptamente debido a un tiro del valor V.
      • Si el bloque finally finaliza abruptamente por razones de S, entonces la instrucción try finaliza abruptamente por la razón S (y el lanzamiento del valor V se descarta y se olvida).

(1) Execution of try-catch-finally

12

El interior finalmente se ejecuta antes de lanzar la excepción al bloque exterior.

public class TryCatchFinally { 

    public static void main(String[] args) throws Exception { 

    try{ 
     System.out.println('A'); 
     try{ 
      System.out.println('B'); 
      throw new Exception("threw exception in B"); 
     } 
     finally 
     { 
      System.out.println('X'); 
     } 
     //any code here in the first try block 
     //is unreachable if an exception occurs in the second try block 
    } 
    catch(Exception e) 
    { 
     System.out.println('Y'); 
    } 
    finally 
    { 
     System.out.println('Z'); 
    } 
    } 
} 

Resultados en

A 
B 
X 
Y 
Z 
3

versiones de Java antes de la versión 7 permiten estas tres combinaciones de try-catch-finally ...bloque

try - catch 
try - catch - finally 
try - finally 

finally será siempre se ejecuta independientemente de lo que está pasando en el try y/o catch bloque. entonces, si no hay un bloque catch, la excepción no se manejará aquí.

Sin embargo, aún necesitará un controlador de excepción en algún lugar de su código, a menos que desee que su aplicación se bloquee completamente, por supuesto. Depende de la arquitectura de su aplicación, exactamente donde está ese controlador.

  • bloque try Java debe estar seguido de un retén o finally.
  • Para cada bloque de prueba, puede haber cero o más bloques de captura, pero solo un bloque finalmente.
  • El bloque finally no se ejecutará si el programa finaliza (llamando a System.exit() o causando un error fatal que provoca el aborto del proceso).
+1

"antes de permitir la versión 7" ¿está implicando que Java 7 y Java 8 no permiten estas tres combinaciones? Dudo que sea eso lo que quieres decir, pero eso es lo que implica tu respuesta. – Aaron

+0

es el bloque finally ejecutado si hay una instrucción return en el bloque try? – Rahul

+0

@Rahul Sí, finalmente se llamará. Ref: http://stackoverflow.com/questions/65035/does-finally-always-execute-in-java – roottraveller