public class RantaiPenyebab {
    public static void main(String[] args) {
        try {
            muatKonfigurasi();
        } catch (IllegalStateException e) {
            System.out.println("Jenis   : " + e.getClass().getSimpleName());
            System.out.println("Pesan   : " + e.getMessage());

            Throwable akar = e.getCause();
            System.out.println("Penyebab: " + akar.getClass().getSimpleName()
                    + " - " + akar.getMessage());

            StackTraceElement frameAkar = akar.getStackTrace()[0];
            System.out.println("Frame penyebab: " + frameAkar.getMethodName()
                    + " di baris " + frameAkar.getLineNumber());
        }
    }

    static void muatKonfigurasi() {
        try {
            bacaBerkas();
        } catch (IllegalArgumentException akar) {
            // Bungkus ulang dengan konteks, tapi simpan penyebab aslinya
            throw new IllegalStateException("Gagal memuat konfigurasi", akar);
        }
    }

    static void bacaBerkas() {
        throw new IllegalArgumentException("Baris ke-3 bukan angka");
    }
}
