Close resources in reverse order safely

Java
import java.util.ArrayList;
import java.util.List;

/** Collects closeable resources and closes them in reverse order. */
public final class ResourceScope implements AutoCloseable {

    private final List<AutoCloseable> resources = new ArrayList<>();
    private final List<Exception> failures = new ArrayList<>();

    public <T extends AutoCloseable> T add(T resource) {
        resources.add(resource);
        return resource;
    }

    @Override
    public void close() throws Exception {
        // Reverse order mirrors nested try-with-resources and dependency order.
        for (int i = resources.size() - 1; i >= 0; i--) {
            try {
                resources.get(i).close();
            } catch (Exception e) {
                failures.add(e);
            }
        }
        if (!failures.isEmpty()) {
            Exception first = failures.get(0);
            for (Exception extra : failures.subList(1, failures.size())) {
                first.addSuppressed(extra);
            }
            throw first;
        }
    }
}