
После завершения выполнения кода в блоке try (независимо от успешности его выполнения), всегда вызывается метод close() указанного ресурса.
Если метод close() тоже выбрасывает исключение, оно будет подавлено исключением, выброшенным при выполнении блока try. Доступ к подавленному исключению можно получить с помощью метода getSuppressed().
class MyClass implements AutoCloseable {
void run() throws Exception {
throw new Exception("Exception from run()");
}
@Override
public void close() throws Exception {
System.out.println("MyClass is closed");
throw new Exception("Exception from close()");
}
}
class Test {
public static void main(String[] args) {
try(MyClass mc = new MyClass()) {
System.out.println(mc.getClass());
mc.run();
}catch(Exception e) {
System.out.println(Arrays.toString(e.getSuppressed()));
}
}
}
/*
class package.MyClass
MyClass is closed
[java.lang.Exception: Exception from close()]
*/
Если не вызывать метод run(), вывод будет такой:
/*
class package.MyClass
MyClass is closed
[]
*/