usar studio programacion móviles libros desarrollo definicion curso codigo aplicaciones java try-catch-finally

java - studio - programacion android pdf 2018



Por qué usar finalmente en lugar de código después de la captura (14)

De acuerdo con HeadFirst Java, un bloque finally se ejecutará incluso si el bloque try o catch tiene una declaración de retorno. El flujo salta para finalmente y luego vuelve para volver.

Esta pregunta ya tiene una respuesta aquí:

Porque hacer esto

} catch (SQLException sqle) { sqle.printStackTrace(); } finally { cs.close(); rs.close(); }

En lugar de esto

} catch (SQLException sqle) { sqle.printStackTrace(); } rs.close(); cs.close();


El bloque finally puede no ejecutarse siempre, considere el siguiente código.

public class Tester { public static void main(String[] args) { try { System.out.println("The main method has run"); System.exit(1); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("The finally block has run"); } } }

En su caso, sugeriría envolver el código dentro del bloque finalmente en try / catch, ya que aparentemente este código puede generar una excepción.

} catch (SQLException sqle) { sqle.printStackTrace(); } finally { try { cs.close(); rs.close(); } catch (Exception e) { //handle new exception here }


En http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html esto es engañoso (y puede haber originado la pregunta):

The try block of the writeList method that you''ve been working with here opens a PrintWriter. The program should close that stream before exiting the writeList method. This poses a somewhat complicated problem because writeList''s try block can exit in one of three ways.

1. The new FileWriter statement fails and throws an IOException. 2. The list.get(i) statement fails and throws an IndexOutOfBoundsException. 3. Everything succeeds and the try block exits normally.

IndexOutOfBoundsException cuarta forma (se IndexOutOfBoundsException una excepción distinta de IOException y IndexOutOfBoundsException ). El código que se muestra en la página anterior solo captura (1) y (2) antes de recurrir a finally .

También soy nuevo en Java y tuve las mismas preguntas antes de encontrar este artículo. La memoria latente tiende a unirse más a los ejemplos que a la teoría, en general.


Esta es la manera de evitar las fugas de recursos.



La palabra clave finally garantiza que el código se ejecuta. En su ejemplo inferior, las instrucciones de cierre NO se ejecutan. En el ejemplo superior, se ejecutan (lo que quieras!)


Mire su bloque catch - va a lanzar la DAOException . Por lo tanto, las declaraciones después de su bloque catch no se ejecutarán incluso en la muestra que ha proporcionado . Lo que has mostrado (envolviendo una excepción en otra) es un patrón común, pero otra posibilidad es que el bloque catch "accidentalmente" lanza una excepción, por ejemplo, porque una de las llamadas que hace falla.

Además, puede haber otras excepciones que no detecte, ya sea porque ha declarado que el método las arroja o porque son excepciones sin marcar. ¿Realmente quieres filtrar recursos porque una IllegalArgumentException se lanzó en algún lugar?


Porque asegura que las cosas en el bloque finally se ejecuten. Es posible que no se ejecuten cosas después de la captura, por ejemplo, hay otra excepción en el bloque catch, que es muy posible. O simplemente haz lo que hiciste y lanza una excepción envolviendo la excepción original.


Porque si se lanza una excepción,

  • El código en la cláusula finally se ejecutará a medida que la excepción se propague hacia el exterior, incluso si la excepción anula el resto de la ejecución del método;

  • El código después del bloque try / catch no se ejecutará a menos que la excepción sea capturada por un bloque catch y no sea devuelta.


Porque si se produce una excepción, no se produce ningún código después de que se ejecute el bloque try menos que se detecte la excepción. Siempre se ejecuta un bloque final sin importar lo que pase dentro de su bloque try .


Se llamará al código en el bloque finally antes de que la excepción se vuelva a eliminar del bloque catch. Esto asegura que se llame a cualquier código de limpieza que haya puesto en el bloque finally. No se ejecutará el código fuera del bloque finally.


Si detecta todos los errores, no debería haber diferencia, de lo contrario, solo se ejecutará el código dentro del bloque final porque la secuencia de ejecución del código es: finalmente código -> error lanzar -> código después de la captura, por lo tanto, una vez que su código arroje un error no manejado, solo finalmente bloque de código funciona como se esperaba.


Su segundo enfoque no hará las declaraciones de ''cierre'' porque ya se dejó el método.


Tenga en cuenta que la captura puede lanzar una excepción a las funciones de nivel superior en la pila de llamadas. Esto conducirá a una llamada final antes de lanzar la excepción al nivel superior.