Java >> Tutoriel Java >  >> Java

L'instruction try-with-resource en Java

Considérez la fonction suivante :

import java.io.*;

public class Try {
    public static void main(String args[]) {
        Try ob = new Try();
        ob.func();
    }

    void func() {
        BufferedReader br = new BufferedReader(new FileReader("C:\\example.txt"));

        try {
            System.out.println(br.readLine());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }

}

Dans ce cas, nous utilisons une ressource de classe BufferedReader . Si la méthode br.readLine() lève une exception (ou même dans le cas où elle ne lève pas d'exception), la ressource de la classe BufferedReader reste ouverte. En Java, il est essentiel de fermer toutes les ressources lorsqu'elles ne sont plus nécessaires. Une façon de l'implémenter est d'utiliser le bloc final, où nous fermons les ressources nécessaires.

import java.io.*;

public class Try {
    public static void main(String args[]) {
        Try ob = new Try();
        ob.func();
    }

    void func() {
        BufferedReader br = new BufferedReader(new FileReader("C:\\example.txt"));

        try {
            System.out.println(br.readLine());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            if (br != null) br.close();
        }

    }

}

Si nous établissons une connexion à de nombreuses ressources dans le bloc try, nous aurions besoin de toutes les fermer une par une dans le bloc finally. Une autre méthode, prise en charge par Java 7 et toutes les versions ultérieures, consiste à utiliser un bloc try-with-resource .

La syntaxe générale du bloc try-with-resource est :

try (  //Open Resources here  )
{
  //Use Resources here
}
catch( //Catch exceptions here  )
{
//Handle Exceptions here
}
//Resources get automatically closed

Dans le bloc try-with-resource , toutes les ressources sont automatiquement fermées. Nous pouvons avoir des blocs attrapés et enfin avec le bloc try-with-resource . Tout bloc catch ou finally est exécuté après la fermeture des ressources. Nous pouvons ouvrir plusieurs ressources dans l'instruction try-with-resource, qui doivent toutes implémenter l'interface Java.lang.AutoCloseable . Les ressources sont fermées dans l'ordre inverse de leur création.

Considérez la mise à jour suivante de notre code :

import java.io.*;

public class Try {
    public static void main(String args[]) {
        Try ob = new Try();
        ob.func();
    }

    void func() {
        try (BufferedReader br = new BufferedReader(new FileReader("C:\\example.txt"))) {
            System.out.println(br.readLine());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

Sortie

C:\example.txt (No such file or directory)

La ressource BufferedReader est automatiquement fermée, que le bloc try s'exécute normalement ou brusquement.

La essayez avec la ressource présente plusieurs avantages :

  • Cela rend le code plus facile à lire et à interpréter
  • Les ressources sont gérées automatiquement
  • Nous n'avons pas besoin de faire un bloc finally spécialement pour fermer les ressources
  • Plusieurs ressources peuvent être ouvertes dans l'instruction try-with-resource, séparées par des points-virgules
  • Les ressources sont fermées dans l'ordre inverse pour éviter tout problème de dépendance
import java.io.*;

public class Try {
    public static void main(String args[]) {
        Try ob = new Try();
        ob.func();
    }

    void func() {
        try (FileInputStream fin = new FileInputStream("file.txt"); BufferedReader br = new BufferedReader(new FileReader("C:\\example.txt"))) {
            System.out.println(br.readLine());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

Sortie

file.txt (No such file or directory)

Remarque : Les sorties de ces programmes lèvent une exception car elles font référence à des fichiers qui ne sont pas présents dans ce chemin.


Balise Java