Passer au contenu principal
eLearner.app
Module 5 · Leçon 2 sur 210/14 dans le cours~12 min
Leçons du module (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

Exercice#java.m5.l2.e1
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives

Exercice#java.m5.l2.e2
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives

Exercice#java.m5.l2.e3
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

Separa la dichiarazione delle due risorse all'interno delle parentesi tonde di `try` tramite un punto e virgola `;`.

Solution disponible après 3 tentatives