Original code
try (AutoCloseable resource = new ClosableResource()) {
// ...
}
Compiled code equivalent
AutoCloseable resource = new ClosableResource();
Throwable $exception = null;
try {
// ...
} catch (Throwable $e) {
$exception = $e;
throw $e;
} finally {
if (resource != null) {
if ($exception != null) {
try {
resource.close();
} catch (Throwable $e) {
$exception.addSuppressed($e);
}
} else {
resource.close();
}
}
}
Note
|
Local variables starting with '$' in the above code are only named for clarity. These variables are otherwise unnamed, referenced only by slot number. |
Catch and finally block are compiled as parts of a regular try-catch-finally block wrapping the try-with-resource block.
Original code
try (AutoCloseable resource = new ClosableResource()) {
// ...
} catch (Exception1 e) {
// ...
} catch (Exception2 e) {
// ...
} finally {
// ...
}
Compiled code equivalent (using basic try-with-resource for code brevity)
try {
try (AutoCloseable resource = new ClosableResource()) {
// ...
}
} catch (Exception1 e) {
// ...
} catch (Exception2 e) {
// ...
} finally {
// ...
}
Multiple resources are compiled as nested try-with-resource code blocks.
Original code
try (AutoCloseable resource1 = new ClosableResource();
AutoCloseable resource2 = new ClosableResource()) {
// ...
}
Compiled code equivalent (using basic try-with-resource for code brevity)
try (AutoCloseable resource1 = new ClosableResource()) {
try (AutoCloseable resource2 = new ClosableResource()) {
// ...
}
}