[JAVA] Verwenden Sie "Try-with-Resources" anstatt "Try-finally"

Ressource schließen mit try-finally

Wenn Sie einige Ressourcen (InputStream, OutputStream, BufferedReader usw.) im try-Block verarbeiten, indem Sie die close-Methode im finally-Block vor Java7 aufrufen, wird die Ressource unabhängig davon, ob die Verarbeitung im try-Block normal oder abnormal beendet wurde. Wurde garantiert sicher geschlossen. Es sieht aus wie das:

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();
	}
}

Darüber hinaus gibt es auch Überprüfungen, um zu verhindern, dass Ausnahmen im finally-Block auftreten.

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

Es gibt jedoch einige Probleme mit diesen Schreibstilen.

Probleme beim Schließen von Ressourcen in try-finally

Java 7 führte die Try-with-Resources-Syntax für diese Probleme ein. Die Try-with-Resources-Syntax löst diese Probleme auf einmal.

Schließen von Ressourcen mit Try-with-Resources

Beschreiben Sie unmittelbar nach dem Versuch den Prozess zum Generieren der zu schließenden Ressource. Wenn mehrere Ressourcen geschlossen werden müssen, trennen Sie sie mit einem Semikolon.

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);
		}
	}
}

Wenn Sie so schreiben, ist das Verhalten wie folgt.

Dies löst die unter "Probleme beim Schließen von Ressourcen in try-finally" genannten Probleme.

Lektion

Verwenden Sie Try-with-Resources anstelle von Try-finally, wenn Sie mit Ressourcen arbeiten, die geschlossen werden müssen

Referenz

Recommended Posts

Verwenden Sie "Try-with-Resources" anstatt "Try-finally"
[Swift] Verwenden Sie diese Option für wo und nicht für und wenn