[JAVA] Utilisez try-with-resources plutôt que try-finally

Ressource close avec try-finally

Lors de la gestion de certaines ressources (InputStream, OutputStream, BufferedReader, etc.) dans le bloc try, en appelant la méthode close dans le bloc finally avant Java7, la ressource indépendamment du fait que le traitement dans le bloc try se soit terminé normalement ou anormalement. A été garanti pour être fermé en toute sécurité. Cela ressemble à ceci:

protected void copy(String src, String dest) throws IOException {
	InputStream in = new FileInputStream(src);
	try {
		OutputStream out = new FileOutputStream(dest);
		try {
			byte[] buf = new byte[100];
			int n;
			while ((n = in.read(buf)) >= 0) {
				out.write(buf, 0, n);
			}
		} finally {
			out.close();
		}
	} finally {
		in.close();
	}
}

En outre, il existe également des vérifications pour empêcher les exceptions de se produire dans le bloc finally.

} finally {
	if (br != null)
		try {
			br.close();
		} catch (IOException e) {
			//Gestion des exceptions
		}
}

Cependant, ces styles d'écriture posent certains problèmes.

Problèmes avec la fermeture des ressources lors de l'essai final

Java 7 a introduit la syntaxe try-with-resources pour ces problèmes. La syntaxe try-with-resources résout ces problèmes en une seule fois.

Ressource se fermant avec try-with-resources

Immédiatement après l'essai, décrivez le processus de génération de ressources à fermer. S'il y a plusieurs ressources à fermer, séparez-les par un point-virgule.

protected void copy(String src, String dest) throws IOException {
	try (InputStream inputStream = new FileInputStream(src); OutputStream outputStream = new FileOutputStream(dest)) {
		byte[] buf = new byte[100];
		int n;
		while ((n = in.read(buf)) >= 0) {
			out.write(buf, 0, n);
		}
	}
}

En écrivant comme ça, le comportement sera le suivant.

Cela résout les problèmes mentionnés dans "Problèmes avec la fermeture des ressources dans try-finally".

Leçon

Utilisez try-with-resources plutôt que try-finally lorsque vous traitez avec des ressources qui doivent être fermées

référence

Recommended Posts

Utilisez try-with-resources plutôt que try-finally
[Swift] Utiliser pour où plutôt que pour imbriquer pour et si