Warum close-Methode von java.lang.AutoCloseable wirft Ausnahme, aber die close-Methode von java.io.Verschließbar throws IOException?
War ich der Lektüre dieses link für try-with-resources
und er sagt:
Die close-Methode des
Closeable
interface exceptions wirft der TypIOException
während die close-Methode desAutoCloseable
interface exceptions wirft der TypException
.
Aber warum? Die close-Methode des AutoCloseable
hätte auch geworfen IOException
gibt es irgendein Beispiel, dass die Unterstützung, die close-Methode des AutoCloseable
müssen Ausnahmen vom Typ Exception
- Ich denke, es ist einfach eine schlechte Entscheidung, auf die Sprache Entscheidungsträger Teil. Es erfordert, dass Sie fangen eine generische Ausnahme, wo immer Sie mit try-mit-Ressourcen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
AutoClosable
- Schnittstelle befindet sich injava.lang
und soll angewendet werden, um jede Ressource, die geschlossen werden muss 'automatisch' (try-mit-Ressourcen). DieAutoClosable
muss nicht sein, ein E /a-bezogenen Ressourcen. So kann das interface nicht jede Annahme einer konkreten Ausnahme.Auf der anderen Seite
Closable
befindet sich injava.io
und erstreckt sichAutoClosable
, weil einClosable
ist einAutoClosable
für io-Ressourcen. Daher erklärt er, dassIOException
s geworfen werden kann auf schließen.Zum Beispiel... ein
java.sql.Connection
ist einAutoClosable
weil es der close-Methode wirftSQLException
und einSQLException
ist nicht einIOException
. Denke, über in-memory-DBs und es macht Sinn, dass die Schließung einer sql-Verbindung müssen Sie nicht werfen Sie eineIOException
.BEARBEITEN
Ich denke, es liegt in
java.lang
weil try-mit-Ressourcen wurde eingeführt, als ein Sprach-feature in Java 1.7. Sojava.lang
AutoClosable
gehalten wird unterjava.lang
Paket. Danke.AutoCloseable
erstellt wurde, an alle, statt nur die Wiederverwendung vonCloseable
.Closeable
gab vor Java 1.7 und es istclose
Methode wurde bereits werfenIOException
; ich kann mir vorstellen, dass, wenn Sie eingeführtAutoCloseable
und herausnehmbareCloseable
zu verlängern, fanden Sie, dass dieAutoCloseable.close
würde unbedingt werfen einer checked exception (Vererbung/method overriding-Vorschriften);Exception
war die vernünftigste option in diesem Fall.Closeable
erstrecktAutoCloseable
, aber es könnten auch andere, insbesondere Schnittstellen, die Sie erweitern diese Schnittstelle. E. g.:Wollten Sie haben eine Schnittstelle, die verwendet werden können, in vielen Fällen, und das ist, warum Sie beschlossen, zu verwenden
Exception
da funktioniert es auch für andere Arten von Ausnahmen.Weiter, um in der Lage zu werfen, einige andere Arten von Ausnahmen als
IOException
eine schöne und gemeinsame Nutzung Fall kann leicht übersehen:Kann man überschreiben Sie die Schnittstelle zu haben, die keine
throws
Erklärung an alle, so erlaubentry
geschrieben ohne explizite Ausnahmebehandlung.In unserem code haben wir eine Schnittstelle
Searcher
erklärt, in der folgenden WeiseDies erlaubt die folgende Verwendung der
Searcher
Instanzen:Wenn keine
throws
Erklärung wurde aufAutoCloseable
, das oben wäre die einzige Verwendung, als wäre es nicht möglich, das überschreiben derAutoCloseable
Schnittstelle auslösen einer Ausnahme nicht deklariert auf die Muttergesellschaft. Wie es derzeit gemacht, beide Optionen sind möglich.