[JAVA] catch (Ausnahme e) oder catch (IOException e) ist in der Try-with-Resources-Syntax nicht erforderlich

Try-with-Resources-Syntax, die einen Aufruf von close () garantiert

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 aus

Wenn 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.

Sie können "close ()" schreiben, das keine "IOException" auslöst

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

catch (Ausnahme e) oder catch (IOException e) ist in der Try-with-Resources-Syntax nicht erforderlich
Wenn das Projekt nicht in Eclipse angezeigt wird
Ebean.update () wird im geerbten Modell nicht ausgeführt.
Was ist besser, Kotlin oder zukünftiges Java?
[Fehler] Die App wird in der Produktionsumgebung nicht angezeigt
Wirf eine Ausnahme und fange, wenn es keinen Handler gibt, der dem Pfad im Frühjahr entspricht
Was ist, wenn ich eine finally-Klausel in die Try-with-Resources-Syntax schreibe?
Das Repository ... ist kein signierter Fehler im Docker Build Apt-Get Update
Was ist @Override oder @SuppressWarnings ("SleepWhileInLoop") vor der Funktion? ?? ??