[JAVA] Was ist, wenn ich eine finally-Klausel in die Try-with-Resources-Syntax schreibe?

Plötzliche Frage. Was passiert, wenn Sie eine finally-Klausel in die Try-with-Resources-Syntax schreiben? Erwarten Sie natürlich, dass die in der try-Klausel angegebene Closeable (AutoCloseable) #close aufgerufen wird und schließlich auch die Klausel aufgerufen wird.

Main.java


public class Main {

    public static void main(String[] args) throws Exception {
        try (Hoge hoge = new Hoge()) {
            System.out.println("try");
        } finally {
            System.out.println("finally");
        }
    }

    public static class Hoge implements AutoCloseable {

        @Override
        public void close() throws Exception {
            System.out.println("close");
        }
    }

}

Ergebnis

try
close
finally

Genau das habe ich erwartet. (Korrekt) Wenn es dekompiliert ist, sieht es so aus.

Main.java


public class Main2 {
    public static void main(String[] args) throws Throwable {
        try {
            Throwable arg0 = null;
            Object arg1 = null;
            try {
                Main.Hoge hoge = new Main.Hoge();
                try {
                    System.out.println("try");
                } finally {
                    if (hoge != null) {
                        hoge.close();
                    }
                }
            } catch (Throwable arg14) {
                if (arg0 == null) {
                    arg0 = arg14;
                } else if (arg0 != arg14) {
                    arg0.addSuppressed(arg14);
                }
                throw arg0;
            }
        } finally {
            System.out.println("finally");
        }
    }

    public static class Hoge implements AutoCloseable {
        public void close() throws Exception {
            System.out.println("close");
        }
    }
}

Recommended Posts

Was ist, wenn ich eine finally-Klausel in die Try-with-Resources-Syntax schreibe?
Androd: Was tun gegen "The Realm befindet sich bereits in einer Schreibtransaktion in"
Was ich beim Erstellen eines Servers in Java gelernt habe
Worauf ich beim ActiveModel :: Serializer-Test gestoßen bin
Selbst wenn ich die Einstellung von STRICT_QUOTE_ESCAPING in CATALINA_OPTS in tomcat8.5 schreibe, wird sie nicht wiedergegeben.
Was tun, wenn in GlassFish eine java.io.IOException auftritt?
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
Ich war verwirrt, weil es eine Aufteilung im Array gab
Benötige ich einen Test, wenn ich DDD in einer Sprache mit einem Typ mache?
Was tun, wenn in Docker ein gcc-Fehler auftritt?
Ich habe versucht, den Weihnachtsbaum in einem Lebensspiel zu beleuchten
Ich habe versucht, Code wie eine Typdeklaration in Ruby zu schreiben
Über das, was ich beim Erstellen einer CLJ-Datei mit Clojure getan habe
[Anmerkung] Was ich in einem halben Jahr von unerfahrenen (Java) gelernt habe
[Anmerkung] Was ich in einem halben Jahr von unerfahrenen (Java) gelernt habe (1)
Ich habe kürzlich eine JS-App in der gemunkelten Dart-Sprache erstellt
Was tun, wenn die Rails-Seite im Rails-Lernprogramm 1.3.2 nicht angezeigt wird?
Was ich bei der Migration von der Spring Boot 1.4-Serie zur 2.0-Serie getan habe
Was tun, wenn Cloud 9 im Rails-Lernprogramm voll ist?
[Anmerkung] Was ich in einem halben Jahr von unerfahrenen (Java) gelernt habe (3)
Was ich bei der Migration von der Spring Boot 1.5-Serie zur 2.0-Serie getan habe
Was tun, wenn Sie Ihr Root-Passwort unter CentOS7 vergessen haben?
Was tun, wenn das von refile gepostete Bild nach dem Einstellen der 404-Fehlerseite in Rails verschwindet?
Was tun, wenn der Vorgang nicht zulässig ist, wenn ein Befehl im Terminal ausgeführt wird?
Ich habe ein PDF mit Java erstellt.
Was ist ein Ausschnitt in der Programmierung?
Was sind die Regeln in JUnit?
Ich möchte JSP in Emacs einfacher als die Standardeinstellung schreiben.
Was tun, wenn Sie in Thymeleaf Layout eine groovige Warnung erhalten?
Schreiben Sie einen Nullfall mit dem Typ Optional, ohne die if-Anweisung zu verwenden
Was tun, wenn das Präfix c in JSP nicht gebunden ist?
Die Parameter, die ich in Rails erhalten habe, waren etwas anders als ich erwartet hatte
catch (Ausnahme e) oder catch (IOException e) ist in der Try-with-Resources-Syntax nicht erforderlich
Anmerkung: [Java] Wenn sich eine Datei im überwachten Verzeichnis befindet, verarbeiten Sie sie.
Ich kann nicht bauen, wenn ich das Build-Ziel mit XCode12 auf einen Simulator setze!
Was ich getan habe, als JSF keine Datenbankinformationen in der Ansicht anzeigen konnte
[Swift / Beginner] Schreiben wir die Funktionen rund um die Kommunikation in eine separate Datei
Was tun, wenn eine javax.net.ssl.SSLHandshakeException angezeigt wird: Remote-Host hat während des Handshakes im IBM JDK die Verbindung geschlossen