Lecciones del módulo (2/2)
Try-with-resources
En versiones más antiguas de Java, la gestión de recursos que requieren un cierre explícito (como archivos, conexiones a bases de datos o flujos de red) requería el uso obligatorio de un bloque finally para asegurar su cierre. Esto daba lugar a un código verboso y propenso a fugas de memoria (memory leaks).
A partir de Java 7, se introdujo la instrucción try-with-resources, que garantiza el cierre automático de todos los recursos declarados dentro del bloque try, siempre que implementen la interfaz AutoCloseable.
La Sintaxis
Los recursos se declaran e inicializan dentro de paréntesis inmediatamente después de la palabra clave try.
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line = br.readLine();
System.out.println(line);
} catch (IOException e) {
System.out.println("Errore di I/O: " + e.getMessage());
}
// br viene chiuso automaticamente qui, anche se si verifica un'eccezione
Declarar Recursos Múltiples
Es posible instanciar múltiples recursos dentro del mismo bloque try, separándolos con un punto y coma ;. Los recursos se cerrarán en orden inverso a su declaración.
try (
FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt")
) {
// Utilizzo delle risorse
} catch (IOException e) {
System.out.println("Errore: " + e.getMessage());
}
Crear Recursos Personalizados
Se puede utilizar un recurso personalizado en un try-with-resources siempre que implemente java.lang.AutoCloseable y sobrescriba el método close().
public class DatabaseConnection implements AutoCloseable {
public void query(String sql) {
System.out.println("Eseguo query: " + sql);
}
@Override
public void close() {
System.out.println("Connessione chiusa!");
}
}
Pruébalo tú
Completa el método readFile utilizando el constructor try-with-resources para inicializar un BufferedReader que envuelva un FileReader en path. En el bloque catch, captura la excepción IOException e imprime 'Error reading file'.
Mostrar pista
Declara el `BufferedReader` entre paréntesis redondos inmediatamente después de `try`, y realiza la captura de `IOException`.
Solución disponible después de 3 intentos
Instancia el recurso personalizado CustomResource dentro de un bloque try-with-resources, invoca el método doWork() en él y maneja la excepción Exception imprimiendo 'Error'.
Mostrar pista
Usa `try (CustomResource res = new CustomResource())` y llama a `res.doWork();` en su interior.
Solución disponible después de 3 intentos
Declara simultáneamente FirstResource y SecondResource en el mismo constructor try-with-resources. Maneja Exception imprimiendo 'Error'.
Mostrar pista
Separa la declaración de los dos recursos dentro de los paréntesis redondos de `try` con un punto y coma `;`.
Solución disponible después de 3 intentos