Pregunta

Estoy revisando un código nuevo. El programa tiene una oportunidad y una única finally. Dado que se excluye el bloque catch, ¿cómo funciona el intento de trabajo por categorías si se encuentra una excepción o cualquier cosa arrojadiza? ¿Se acaba de ir directamente al bloque finally?

¿Fue útil?

Solución

Si cualquier parte del código en el bloque try puede lanzar una excepción comprobada, tiene que aparecer en la cláusula throws de la firma del método. Si se produce una excepción no se controla, se hace burbujear fuera del método.

El bloque finally siempre se ejecuta, si se produce una excepción o no.

Otros consejos

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

  • System.exit() se llama.
  • La JVM se bloquea.
  • El bloque try{} nunca extremos (bucle sin fin, por ejemplo).

La especificación del lenguaje Java (1) describe cómo se ejecuta try-catch-finally. Al no tener problema es equivalente a no tener una captura capaz de coger el Throwable 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, a continuación, 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 ultima bruscamente a la razón S, entonces la instrucción try termina abruptamente por razones S (y de banda de valor V es descartado y olvidado).

(1) Ejecución de try-catch-finally

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');
    }
  }
}

Los resultados en

A
B
X
Y
Z

El bloque finally siempre se ejecuta después de los extremos de bloque try, si extremos try normalmente o anormalmente debido a una excepción, er, throwable.

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

Si el bloque finally se produce una excepción / error / throwable, y ya hay una pendiente throwable, se pone feo. Francamente, no recuerdo exactamente lo que sucede (tanto por mis años de certificación atrás). I Think ambos throwables a conectarse entre sí, pero hay algo de vudú especial que tiene que hacer (es decir - una llamada al método tendría que mirar hacia arriba) para obtener el problema original antes de que el "fin" barfed, er, vomitó.

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

por ejemplo. -

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

"Finalmente", uno más consejo: si no se molestan en poner en una captura, ya sea específica de captura (esperado) subclases arrojadizos, o simplemente coger "Throwable", no "Excepción", por un cajón de sastre trampa de error general. Demasiados problemas, como goofs reflexión, lanzar "Errores" en lugar de "Excepciones", y los que se deslice por cualquier razón "todo" ni codificado como:

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

hacer esto en su lugar:

catch ( Throwable t) ...

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

try - catch
try - catch - finally
try - finally

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

Sin embargo, todavía se necesita un gestor de excepciones en algún lugar en el código - a menos que usted quiere que su aplicación se bloquee por completo, por supuesto. Depende de la arquitectura de su aplicación exactamente donde dicho manejador es.

  • bloque try Java debe estar seguido de un retén o finally.
  • Para cada bloque try no puede ser cero o más bloques catch, pero sólo un bloque finally.
  • El bloque finally no se ejecutará si se sale del programa (ya sea llamando System.exit () o al causar un error grave que hace que el proceso de interrupción).

¿cómo funciona el bloque try si encuentra una excepción o nada throwable

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

Se ejecuta el bloque finally independientemente de cómo se sale del bloque try -. Independientemente de si hay algún capturas en absoluto, independientemente de si hay una trampa a juego

Los bloques de captura y el fin son piezas ortogonales del bloque try. Usted puede tener uno o los dos. Con Java 7, podrás tener ni!

No se intenta que con ese programa? Se va a Goto finally y ejecutar el bloque finally, pero, no se controla la excepción. Sin embargo, esta excepción puede ser revocada en el bloque finally!

El bloque finally se ejecuta después de que se complete el bloque try. Si algo es lanzada dentro del bloque try cuando sale se ejecuta el bloque finally.

En el interior del bloque try escribimos códigos que pueden lanzar una excepción. El bloque catch es donde manejamos la excepción. El bloque finally siempre se ejecuta independientemente de si se produce o no una excepción.

Ahora bien, si tenemos try-finally en lugar de try-catch-finally entonces la excepción no debe ser manipulado y después del bloque try en lugar del control va al bloque de captura irá a bloquear finalmente. Podemos utilizar try-finally cuando queremos hacer nada con la excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top