public class SumberDayaDemo {
    public static void main(String[] args) {
        System.out.println("-- penutupan manual saat exception mengganggu --");
        try {
            SumberDaya koneksi = new SumberDaya("basisdata");
            koneksi.gunakan();
            koneksi.lemparGangguan();
            koneksi.close();   // baris ini tidak pernah tercapai
        } catch (IllegalStateException e) {
            System.out.println("tertangkap: " + e.getMessage());
        }

        System.out.println();
        System.out.println("-- try-with-resources saat exception mengganggu --");
        try (SumberDaya koneksi = new SumberDaya("jaringan")) {
            koneksi.gunakan();
            koneksi.lemparGangguan();
        } catch (IllegalStateException e) {
            System.out.println("tertangkap: " + e.getMessage());
        }
    }
}

class SumberDaya implements AutoCloseable {
    private final String nama;

    SumberDaya(String nama) {
        this.nama = nama;
        System.out.println("buka " + nama);
    }

    void gunakan() {
        System.out.println("gunakan " + nama);
    }

    void lemparGangguan() {
        throw new IllegalStateException("sambungan terputus");
    }

    @Override
    public void close() {
        System.out.println("tutup " + nama);
    }
}
