Lezioni del modulo (2/2)
Try-with-resources
Nelle versioni meno recenti di Java, la gestione di risorse che richiedono una chiusura esplicita (come file, connessioni a database o stream di rete) richiedeva l'uso obbligatorio di un blocco finally per assicurarne la chiusura. Questo portava a codice verboso e incline a leak di memoria.
A partire da Java 7, è stata introdotta l'istruzione try-with-resources, che garantisce la chiusura automatica di tutte le risorse dichiarate all'interno del blocco try, a patto che implementino l'interfaccia AutoCloseable.
La Sintassi
Le risorse vengono dichiarate e inizializzate all'interno di parentesi tonde subito dopo la parola chiave 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
Dichiarare Risorse Multiple
È possibile istanziare più risorse all'interno dello stesso blocco try, separandole con un punto e virgola ;. Le risorse verranno chiuse in ordine inverso rispetto alla loro dichiarazione.
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());
}
Creare Risorse Personalizzate
Una risorsa personalizzata può essere utilizzata in un try-with-resources purché implementi java.lang.AutoCloseable e sovrascriva il metodo 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!");
}
}
Prova tu
Completa il metodo readFile utilizzando il costrutto try-with-resources per inizializzare un BufferedReader che avvolge un FileReader su path. Nel blocco catch, cattura IOException e stampa 'Error reading file'.
Mostra suggerimento
Dichiara il `BufferedReader` tra parentesi tonde subito dopo `try`, ed esegui la cattura di `IOException`.
Soluzione disponibile dopo 3 tentativi
Instanzia la risorsa personalizzata CustomResource all'interno di un blocco try-with-resources, invoca il metodo doWork() su di essa e gestisci l'eccezione Exception stampando 'Error'.
Mostra suggerimento
Usa `try (CustomResource res = new CustomResource())` e richiama `res.doWork();` al suo interno.
Soluzione disponibile dopo 3 tentativi
Dichiara contemporaneamente FirstResource e SecondResource nello stesso costrutto try-with-resources. Gestisci Exception stampando 'Error'.
Mostra suggerimento
Separa la dichiarazione delle due risorse all'interno delle parentesi tonde di `try` tramite un punto e virgola `;`.
Soluzione disponibile dopo 3 tentativi