Vidéo: JAVA (Intermédiaire) - 83 - Try with Resources (Partie 2/3) 2024
Imaginez un programme Java qui reçoit des entrées de deux fichiers différents ou d'un
Scanner
et d'un disque fichier. Pour vous assurer que vous effectuez un nettoyage correct, vous devez placer des appels de méthode
close
dans une clause
finally
.
importer java. io. Fichier;
importer java. io. IOException;
importer java. util. Scanner;
public class Main {
public static void principal (String args []) {
Scanner scan1 = null;
Scanner scan2 = null;
try {
scan1 = nouveau Scanner (nouveau fichier ("File1.txt"));
scan2 = nouveau Scanner (nouveau fichier ("File2.txt"));
// Fait des choses utiles
} catch (IOException e) {
// Oups!
} enfin {
scan1. Fermer();
scan2. Fermer();
Système. en dehors. println ("Fait!");
}
}
}
En théorie, l'ordinateur exécute toujours
scan1. close ()
et
scan2. close ()
peu importe ce qui ne va pas pendant l'exécution de la clause
try
. Mais c'est la théorie. En réalité, un autre programmeur (pas vous, bien sûr) pourrait modifier le code en fermant
scan1
au milieu de la clause
try
:
try {
scan1 = nouveau Scanner (nouveau fichier ("File1.txt"));
scan2 = nouveau Scanner (nouveau fichier ("File2.txt"));
// Fait des trucs utiles mais aussi …
scan1. Fermer();
scan1 = null;
} catch (IOException e) {
// Oups!
} enfin {
scan1. Fermer();
scan2. Fermer();
Système. en dehors. println ("Fait!");
}
Vous avez maintenant une vraie situation. Dans la clause
finally
, la valeur de
scan1
est
null
. L'appel à
scan1. close ()
échoue, donc le programme lance une
NullPointerException
et s'arrête avant d'avoir atteint l'appel de
scan2. fermer ()
. Dans le pire des cas,
scan2
n'est pas fermé et votre programme contient
File2. txt
verrouillé pour qu'aucun autre programme ne puisse utiliser le fichier.
Lorsqu'un programme utilise plusieurs ressources (beaucoup de fichiers, une base de données et un fichier, ou autre), la compilation des instructions
try
devient assez compliquée. Vous pouvez faire des
essais
dans les clauses
catch
et toutes sortes de combinaisons folles. Mais Java a une meilleure façon de résoudre le problème: Dans Java 7 (et les versions ultérieures de Java), vous pouvez créer une instruction try-with-resources. Ce code vous montre comment.
import java. io. Fichier;
importer java. io. IOException;
importer java. util. Scanner;
public class NewMain {
public static void principal (String args []) {
try (Scanner scan1 = nouveau Scanner (nouveau fichier ("Fichier1.txt "));
Scanner scan2 = nouveau Scanner (nouveau fichier (" File2.txt "))) {
// Fait des choses utiles
} catch (IOException e) {
// Oups ! v
}
System.println ("Terminé!");
}
}
Dans ce code, les déclarations de
scan1
et
scan2
sont entre parenthèses après le mot
essayez
Les déclarations entre parenthèses disent à Java de fermer automatiquement
scan1
et
scan2
après l'exécution des instructions dans > essayez la clause
Vous pouvez déclarer plusieurs ressources dans les parenthèses d'une instruction
try
Lorsque vous le faites, Java ferme automatiquement toutes les ressources après l'exécution des instructions de la clause
try
. ajoutez des clauses
catch
et une clause
finally
, si vous voulez Vous pouvez accéder à toutes sortes de ressources (fichiers, bases de données, connexions aux serveurs, etc.) et avoir la tranquillité d'esprit en sachant que Java va couper les connexions automatiquement.
La vie est belle.