Try с ресурсами. Подавленные исключения

Try с ресурсами. Подавленные исключения

Если класс имплементирует интерфейс AutoCloseable (реализует метод close()), он может быть использован в блоке try c ресурсами.

После завершения выполнения кода в блоке 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
[]
*/
Исключения