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