Breaking

Post Top Ad

Your Ad Spot

jueves, 19 de diciembre de 2019

Prueba de Java con recursos

En este tutorial, aprenderemos sobre la declaración try-with-resources para cerrar recursos automáticamente.
La try-with-resourcesdeclaración cierra automáticamente todos los recursos al final de la declaración. Un recurso es un objeto que se cerrará al final del programa.
Su sintaxis es:
  1. try (resource declaration) {
  2. // use of the resource
  3. } catch (ExceptionType e1) {
  4. // catch block
  5. }
Como se ve en la sintaxis anterior, declaramos la try-with-resourcesdeclaración por,
  1. declarando e instanciando el recurso dentro de la trycláusula.
  2. especificando y manejando todas las excepciones que pueden ser lanzadas al cerrar el recurso.
Nota: La instrucción try-with-resources cierra todos los recursos que implementan la interfaz AutoCloseable .

Tomemos un ejemplo que implementa la try-with-resourcesdeclaración.

Ejemplo 1: prueba con recursos

  1. import java.io.*;
  2. class Main {
  3. public static void main(String[] args) {
  4. String line;
  5. try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
  6. while ((line = br.readLine()) != null) {
  7. System.out.println("Line =>"+line);
  8. }
  9. } catch (IOException e) {
  10. System.out.println("IOException in try block =>" + e.getMessage());
  11. }
  12. }
  13. }
Salida si no se encuentra el archivo test.txt.
IOException en el bloque try-with-resources => test.txt (No existe tal archivo o directorio)
Salida si se encuentra el archivo test.txt.
Entrar en el bloque de prueba con recursos
Línea => línea de prueba
En este ejemplo, usamos una instancia de BufferedReader para leer datos del test.txtarchivo.
Declarar e instanciar el BufferedReader dentro de la try-with-resourcesdeclaración asegura que su instancia se cierre independientemente de si la trydeclaración se completa normalmente o si se produce una excepción.
Si ocurre una excepción, se puede manejar usando los bloques de manejo de excepciones o la palabra clave throws .

Excepciones suprimidas

En el ejemplo anterior, se pueden generar excepciones desde la try-with-resourcesdeclaración cuando:
  • El archivo test.txtno se encuentra.
  • Cerrando el BufferedReaderobjeto.
También se puede lanzar una excepción desde el trybloque ya que la lectura de un archivo puede fallar por muchas razones en cualquier momento.
Si se lanzan excepciones tanto del trybloque como de la try-with-resourcesdeclaración, tryse lanza la excepción del bloque y try-with-resourcesse suprime la excepción de la declaración.

Recuperando Excepciones Suprimidas

En Java 7 y versiones posteriores, las excepciones suprimidas se pueden recuperar llamando al Throwable.getSuppressed()método desde la excepción lanzada por el trybloque.
Este método devuelve una matriz de todas las excepciones suprimidas. Obtenemos las excepciones suprimidas en el catchbloque.
  1. catch(IOException e) {
  2. System.out.println("Thrown exception=>" + e.getMessage());
  3. Throwable[] suppressedExceptions = e.getSuppressed();
  4. for (int i=0; i<suppressedExceptions.length; i++) {
  5. System.out.println("Suppressed exception=>" + suppressedExceptions[i]);
  6. }
  7. }

Ventajas de usar try-with-resources

Estas son las ventajas de usar try-with-resources:

1. finalmente no es necesario bloquear para cerrar el recurso

Antes de que Java 7 introdujera esta característica, teníamos que usar el finallybloque para asegurarnos de que el recurso esté cerrado para evitar pérdidas de recursos.
Aquí hay un programa que es similar al Ejemplo 1 . Sin embargo, en este programa, hemos utilizado finalmente el bloqueo para cerrar recursos.

Ejemplo 2: cierre el recurso usando finalmente el bloque

  1. import java.io.*;
  2. class Main {
  3. public static void main(String[] args) {
  4. BufferedReader br = null;
  5. String line;
  6. try {
  7. System.out.println("Entering try block");
  8. br = new BufferedReader(new FileReader("test.txt"));
  9. while ((line = br.readLine()) != null) {
  10. System.out.println("Line =>"+line);
  11. }
  12. } catch (IOException e) {
  13. System.out.println("IOException in try block =>" + e.getMessage());
  14. } finally {
  15. System.out.println("Entering finally block");
  16. try {
  17. if (br != null) {
  18. br.close();
  19. }
  20. } catch (IOException e) {
  21. System.out.println("IOException in finally block =>"+e.getMessage());
  22. }
  23. }
  24. }
  25. }
Salida
Entrar al bloque de prueba
Línea => línea del archivo test.txt
Entrando finalmente bloquear 
Como podemos ver en el ejemplo anterior, el uso del finallybloque para limpiar recursos hace que el código sea más complejo.
¿Ves el try...catchbloque en el finallybloque también? Esto se debe a IOExceptionque también puede ocurrir al cerrar la BufferedReaderinstancia dentro de este finallybloque, por lo que también se detecta y se maneja.
La try-with-resourcesdeclaración hace gestión automática de recursos . No necesitamos cerrar explícitamente los recursos ya que JVM los cierra automáticamente. Esto hace que el código sea más legible y más fácil de escribir.

2. probar con recursos con múltiples recursos

Podemos declarar más de un recurso en la try-with-resourcesdeclaración separándolos con un punto y coma;

Ejemplo 3: prueba con múltiples recursos

  1. import java.io.*;
  2. import java.util.*;
  3. class Main {
  4. public static void main(String[] args) throws IOException{
  5. try (Scanner scanner = new Scanner(new File("testRead.txt"));
  6. PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
  7. while (scanner.hasNext()) {
  8. writer.print(scanner.nextLine());
  9. }
  10. }
  11. }
  12. }
Si este programa se ejecuta sin generar ninguna excepción, el Scannerobjeto lee una línea del testRead.txtarchivo y la escribe en un nuevo testWrite.txtarchivo.
Cuando se realizan varias declaraciones, la try-with-resourcesdeclaración cierra estos recursos en orden inverso. En este ejemplo, el PrintWriterobjeto se cierra primero y luego el Scannerobjeto se cierra.

Mejora de prueba con recursos de Java 9

En Java 7, hay una restricción a la try-with-resourcesdeclaración. El recurso debe declararse localmente dentro de su bloque.
  1. try (Scanner scanner = new Scanner(new File("testRead.txt"))) {
  2. // code
  3. }
Si declaramos el recurso fuera del bloque en Java 7, habría generado un mensaje de error.
  1. Scanner scanner = new Scanner(new File("testRead.txt"));
  2. try (scanner) {
  3. // code
  4. }
Para lidiar con este error, Java 9 mejoró la try-with-resourcesdeclaración para que la referencia del recurso pueda usarse incluso si no se declara localmente. El código anterior ahora se ejecutará sin ningún error de compilación.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas