with try the resource examples close catch java java-7

java - the - try with resources examples



Java7 try-with-resources DeclaraciĆ³n de ventaja (7)

Actualización a partir de 2017 después del lanzamiento de Java 9

Ahora con Java 9 tenemos más azúcar sintáctica y podemos tener un recurso declarado fuera del bloque try-catch pero aún manejado correctamente.

Tomemos, por ejemplo, esta forma Java 6 de manejar el recurso:

InputStream stream = new MyInputStream(...); try { // ... use stream } catch(IOException e) { // handle exception } finally { try { if(stream != null) { stream.close(); } } catch(IOException e) { // handle yet another possible exception } }

Aquí podemos observar que este código es increíblemente feo como se señala en otras respuestas.

Entonces la solución en Java 7 fue presentar este try-catch-with-resource :

try (InputStream stream = new MyInputStream(...)){ // ... use stream } catch(IOException e) { // handle exception }

Esta notación es mucho mejor que la anterior, sin embargo, tenemos un problema. Si el recurso ( strem en este caso) ha sido declarado previamente, pero queremos estar seguros de que se maneja correctamente en este bloque, necesitamos un truco como este:

InputStream stream = new MyInputStream(...) try (InputStream stream2 = stream) { // do something with stream being sure that is going to be closed at the end } catch(IOException e) { // handle exception }

Podemos observar que esta situación solo puede abordarse con otra pieza de código feo. Es por eso que con Java 9 el Try-With-Resources se ha mejorado al introducir una nueva sintaxis:

InputStream stream = new MyInputStream(...) try (stream) { // do something with stream being sure that is going to be closed at the end } catch(IOException e) { // handle exception }

Tenga en cuenta que esta sintaxis dará como resultado un error de tiempo de compilación para Java versión 8 o menor

Esta es una forma más "natural" de escribir, aunque en la mayoría de los casos de uso no necesitamos el recurso fuera del alcance del bloque try. La única restricción es que la variable del lector debe ser efectivamente final o simplemente definitiva.

Estaba buscando la nueva característica de Java7. Encontré uno es Declaración de prueba con recursos . ¿Alguien puede decirme qué significa exactamente? ¿Por qué y dónde debemos usarlo y dónde podemos aprovechar esta característica? Incluso la declaración de try falla bloque de catch que me confunde.


¿Qué pasa con esto? Si el recurso se inicializa dentro de try {} ¿no se cierra automáticamente?

try { Scanner scanner = new Scanner(new File(csvFile)); while (scanner.hasNext()) { // do something } scanner.close(); }catch(FileNotFoundException fnfe) { System.err.println(fnfe.getLocalizedMessage()); }


Como se indica en la documentación :

La sentencia try-with-resources es una declaración try que declara uno o más recursos. Un recurso es un objeto que debe cerrarse después de que el programa haya terminado. La instrucción try-with-resources garantiza que cada recurso se cierre al final de la declaración. Cualquier objeto que implemente java.lang.AutoCloseable , que incluye todos los objetos que implementan java.io.Closeable , se puede usar como recurso.

El siguiente ejemplo lee la primera línea de un archivo. Utiliza una instancia de BufferedReader para leer datos del archivo. BufferedReader es un recurso que debe cerrarse después de que el programa haya terminado con él:

static String readFirstLineFromFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } }

En este ejemplo, el recurso declarado en la declaración try-with-resources es un BufferedReader. La declaración declarativa aparece entre paréntesis inmediatamente después de la palabra clave try. La clase BufferedReader, en Java SE 7 y posteriores, implementa la interfaz java.lang.AutoCloseable. Como la instancia de BufferedReader se declara en una sentencia try-with-resource, se cerrará independientemente de si la instrucción try se completa de forma normal o abrupta.

Puedes leer más de here .


En Java, si utiliza un recurso como flujos de entrada o salida, siempre debe cerrarlo después de usarlo. También puede lanzar excepciones por lo que tiene que estar en un bloque try catch . El cierre tiene que estar en el bloque final. Esto es lo que menos vale hasta Java 7. Esto tiene varias desventajas:

  • Tendría que verificar si su recurso es null antes de cerrarlo
  • El cierre en sí puede arrojar excepciones por lo que finally debe contener otro try - catch
  • Los programadores tienden a olvidarse de cerrar sus recursos

Mientras que los dos primeros son principalmente problemas de sintaxis, el último es más crítico. Entonces, si usas la instrucción try-with tu código se vuelve mucho más limpio y lo más importante: tu recurso siempre estará cerrado :-)


La ventaja es que no necesita cerrar explícitamente los recursos que ha definido en la declaración try-with-resources. JVM se encargará de eso. Cerrará automáticamente esos recursos para usted.

En general, los problemas que enfrentan los desarrolladores es estructurar los bloques try-catch-finally porque incluso en el bloque final donde cerramos los recursos tenemos que usar try-catch. Hay varias estructuras de declaración try-catch-finally para ayudar a resolver este problema, pero try-with-resources Statement básicamente lo ayudará a facilitar su lógica de estructura de codificación.


Se introdujo debido a que algunos recursos utilizados en Java (como conexiones o flujos de SQL) son difíciles de manejar de manera adecuada; como ejemplo, en java 6 para manejar un InputStream correctamente, tenía que hacer algo como:

InputStream stream = new MyInputStream(...); try { // ... use stream } catch(IOException e) { // handle exception } finally { try { if(stream != null) { stream.close(); } } catch(IOException e) { // handle yet another possible exception } }

¿Notan ese feo intento doble? ahora con try-with-resources puedes hacer esto:

try (InputStream stream = new MyInputStream(...)){ // ... use stream } catch(IOException e) { // handle exception }

y close () se llama automáticamente, si arroja una IOException, se suprimirá (como se especifica en la Especificación del lenguaje Java 14.20.3 ). Lo mismo ocurre con java.sql.Connection


Beneficios de usar Prueba con recursos

  1. Código más legible y fácil de escribir.

  2. Gestión automática de recursos.

  3. El número de líneas de código se reduce.

  4. No es necesario finalmente bloquear solo para cerrar los recursos.

  5. Podemos abrir múltiples recursos en una declaración try-with-resources separada por un punto y coma. Por ejemplo, podemos escribir el siguiente código.

  6. Cuando se abren múltiples recursos en try-with-resources, los cierra en el orden inverso para evitar cualquier problema de dependencia. Puedes extender mi programa de recursos para probar eso.

public void sampleTryWithResource() { try(Connection dbCon = DriverManager.getConnection("url", "user", "password"); BufferedReader br = new BufferedReader(new FileReader("C://readfile/input.txt"));) { //...Your Business logic } catch (Exception e) { //...Exception Handling } }