Vai al contenuto
eLearner.app
Modulo 5 · Lezione 2 di 210/14 nel corso~12 min
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.

Code
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.

Code
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().

Code
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

Esercizio#java.m5.l2.e1
Tentativi: 0Caricamento…

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'.

Caricamento editor…
Mostra suggerimento

Dichiara il `BufferedReader` tra parentesi tonde subito dopo `try`, ed esegui la cattura di `IOException`.

Soluzione disponibile dopo 3 tentativi

Esercizio#java.m5.l2.e2
Tentativi: 0Caricamento…

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'.

Caricamento editor…
Mostra suggerimento

Usa `try (CustomResource res = new CustomResource())` e richiama `res.doWork();` al suo interno.

Soluzione disponibile dopo 3 tentativi

Esercizio#java.m5.l2.e3
Tentativi: 0Caricamento…

Dichiara contemporaneamente FirstResource e SecondResource nello stesso costrutto try-with-resources. Gestisci Exception stampando 'Error'.

Caricamento editor…
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