Java essayer avec des ressources
Essai Java avec ressources
Dans ce tutoriel, nous allons découvrir l'instruction try-with-resources pour fermer automatiquement les ressources.
Le try-with-resources
L'instruction ferme automatiquement toutes les ressources à la fin de l'instruction. Une ressource est un objet à fermer à la fin du programme.
Sa syntaxe est :
try (resource declaration) {
// use of the resource
} catch (ExceptionType e1) {
// catch block
}
Comme le montre la syntaxe ci-dessus, nous déclarons le try-with-resources
déclaration de,
- déclarer et instancier la ressource dans le
try
clause. - spécifier et gérer toutes les exceptions susceptibles d'être levées lors de la fermeture de la ressource.
Remarque : L'instruction try-with-resources ferme toutes les ressources qui implémentent l'interface AutoCloseable.
Prenons un exemple qui implémente le try-with-resources
déclaration.
Exemple 1 :essayer avec des ressources
import java.io.*;
class Main {
public static void main(String[] args) {
String line;
try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
}
}
}
Sortie si le fichier test.txt est introuvable.
IOException in try-with-resources block =>test.txt (No such file or directory)
Sortie si le fichier test.txt est trouvé.
Entering try-with-resources block Line =>test line
Dans cet exemple, nous utilisons une instance de BufferedReader pour lire les données du test.txt
fichier.
Déclarer et instancier le BufferedReader à l'intérieur du try-with-resources
garantit que son instance est fermée, que le try
l'instruction se termine normalement ou lève une exception.
Si une exception se produit, elle peut être gérée à l'aide des blocs de gestion des exceptions ou du mot-clé throws.
Exceptions supprimées
Dans l'exemple ci-dessus, des exceptions peuvent être levées à partir du try-with-resources
déclaration quand :
- Le fichier
test.txt
est introuvable. - Fermer le
BufferedReader
objet.
Une exception peut également être levée depuis le try
bloquer en tant que lecture de fichier peut échouer pour de nombreuses raisons à tout moment.
Si des exceptions sont levées à la fois par le try
bloc et le try-with-resources
instruction, exception de la try
le bloc est levé et l'exception du try-with-resources
l'instruction est supprimée.
Récupération des exceptions supprimées
Dans Java 7 et versions ultérieures, les exceptions supprimées peuvent être récupérées en appelant le Throwable.getSuppressed()
méthode de l'exception levée par le try
bloquer.
Cette méthode renvoie un tableau de toutes les exceptions supprimées. Nous obtenons les exceptions supprimées dans le catch
bloquer.
catch(IOException e) {
System.out.println("Thrown exception=>" + e.getMessage());
Throwable[] suppressedExceptions = e.getSuppressed();
for (int i=0; i<suppressedExceptions.length; i++) {
System.out.println("Suppressed exception=>" + suppressedExceptions[i]);
}
}
Avantages de l'utilisation de try-with-resources
Voici les avantages de l'utilisation de try-with-resources :
1. bloc finally non requis pour fermer la ressource
Avant que Java 7 n'introduise cette fonctionnalité, nous devions utiliser le finally
bloquer pour s'assurer que la ressource est fermée pour éviter les fuites de ressources.
Voici un programme similaire à Exemple 1 . Cependant, dans ce programme, nous avons utilisé le bloc finally pour fermer les ressources.
Exemple 2 :Fermer la ressource à l'aide du bloc finally
import java.io.*;
class Main {
public static void main(String[] args) {
BufferedReader br = null;
String line;
try {
System.out.println("Entering try block");
br = new BufferedReader(new FileReader("test.txt"));
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
} finally {
System.out.println("Entering finally block");
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
System.out.println("IOException in finally block =>"+e.getMessage());
}
}
}
}
Sortie
Entering try block Line =>line from test.txt file Entering finally block
Comme nous pouvons le voir dans l'exemple ci-dessus, l'utilisation de finally
block pour nettoyer les ressources rend le code plus complexe.
Remarquez le try...catch
bloc dans le finally
bloquer aussi ? C'est parce qu'un IOException
peut également se produire lors de la fermeture du BufferedReader
instance à l'intérieur de ce finally
bloquer afin qu'il soit également intercepté et traité.
Le try-with-resources
l'instruction effectue la gestion automatique des ressources . Nous n'avons pas besoin de fermer explicitement les ressources car JVM les ferme automatiquement. Cela rend le code plus lisible et plus facile à écrire.
2. try-with-resources avec plusieurs ressources
On peut déclarer plus d'une ressource dans le try-with-resources
déclaration en les séparant par un point-virgule ;
Exemple 3 :essayez avec plusieurs ressources
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException{
try (Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
while (scanner.hasNext()) {
writer.print(scanner.nextLine());
}
}
}
}
Si ce programme s'exécute sans générer d'exceptions, Scanner
l'objet lit une ligne du testRead.txt
fichier et l'écrit dans un nouveau testWrite.txt
fichier.
Lorsque plusieurs déclarations sont faites, le try-with-resources
L'instruction ferme ces ressources dans l'ordre inverse. Dans cet exemple, le PrintWriter
l'objet est fermé en premier, puis le Scanner
l'objet est fermé.
Amélioration de l'essai avec les ressources de Java 9
En Java 7, il y a une restriction au try-with-resources
déclaration. La ressource doit être déclarée localement dans son bloc.
try (Scanner scanner = new Scanner(new File("testRead.txt"))) {
// code
}
Si nous avions déclaré la ressource en dehors du bloc dans Java 7, cela aurait généré un message d'erreur.
Scanner scanner = new Scanner(new File("testRead.txt"));
try (scanner) {
// code
}
Pour traiter cette erreur, Java 9 a amélioré le try-with-resources
afin que la référence de la ressource puisse être utilisée même si elle n'est pas déclarée localement. Le code ci-dessus va maintenant s'exécuter sans aucune erreur de compilation.
Java