Close () - Verarbeitung, die mit try-finally wie folgt in Java 6 oder früher geschrieben wurde
Closeable r = null;
try {
//Ressourcen sichern
r = getResource();
//Verwenden Sie Ressourcen
r.use();
} finally {
if (r != null) r.close();
}
Ab Java 7 ist es jedoch mit dem folgenden Schreibstil sehr intelligent geworden.
//Ressourcen sichern
try (Closeable r = getResource()) {
//Verwenden Sie Ressourcen
r.use();
}
Sie kennen die Try-with-Resources-Syntax.
Closeable.close ()
löst IOException
ausWenn Sie nun mit dem obigen Codefragment die eigentliche Programmierung versuchen, werden Sie feststellen, dass einige wichtige Punkte weggelassen werden. Ja, die ausgelöste "IOException" wird nicht verarbeitet. Insbesondere der letztere Code, der die Try-with-Resources-Syntax verwendet, löst "IOException" als Ganzes aus, selbst wenn weder "getResource ()" noch "use ()" IOException "auslösen. Weil es einen close ()
Aufruf gibt, der in der zuckerbeschichteten Syntax nicht sichtbar ist. close ()
löst eine IOException
aus und wir müssen damit umgehen.
Letzteres ist also tatsächlich so
//Ressourcen sichern
try (Closeable r = getResource()) {
//Verwenden Sie Ressourcen
r.use();
} catch (IOException e) {
//Angemessene Verarbeitung
}
Es muss in Form von sein. Oder wirfst du es höher mit "wirft IOException"? In jedem Fall ist der Code etwas lauter als von der ursprünglichen Berührung erwartet. Wenn Sie die Try-with-Resources-Syntax bisher nur einmal verwendet haben, haben Sie dies wahrscheinlich bereits bemerkt.
Jetzt ist das Hauptthema von hier. Sie können den folgenden einfachen Code erstellen, ohne "catch" oder "throw" zu verwenden.
//Ressourcen sichern
try (MyResource r = getResource()) {
//Verwenden Sie Ressourcen
r.use();
}
Es ist möglich, eine "Closeable" / "AutoCloseable" -Klasse zu haben, in der "close ()" immer erfolgreich ist. Also, während ich "Closeable" implementiere, wenn ich eine solche Klasse selbst erstelle
public class MyResource implements Closeable {
public void close() {
//Schließen Sie den Prozess, der immer erfolgreich ist
}
}
Und schreibe close ()
ohne wirft IOException
. Die Schnittstellenimplementierung ist gültig ohne "löst IOException aus". Und wenn diese Klasse eine Ressource ist
//Ressourcen sichern
try (MyResource r = getResource()) {
//Verwenden Sie Ressourcen
r.use();
}
Wirft keine Check-Ausnahme.
Es ist natürlich zu bemerken, aber bei Verwendung der IDE wird "löst IOException" automatisch von Anfang an beschrieben, so dass es angehängt bleibt, obwohl es unnötig ist, und infolgedessen wird unnötiges "Fangen" erzwungen. Es scheint, dass es selten ist, also sogar eine Warnung.
Recommended Posts